首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有一种注册服务的方法,它作为隐式类型给出,并具有多个基元类型参数的构造函数。

有一种注册服务的方法,它作为隐式类型给出,并具有多个基元类型参数的构造函数。
EN

Stack Overflow用户
提问于 2019-10-10 13:25:22
回答 1查看 122关注 0票数 1

我使用dryloc并希望注册服务,该服务作为隐式类型给出,并且可以具有构造函数(或者它可能没有),并且具有多个原始类型的参数,如string或int。

我试过以下几种方法

代码语言:javascript
复制
var container = new Container();

Type serviceType; // some service type
Type serviceKey; // some serviceKey
var param1 = "some param1";
var param2 = "some param2";

container.Register(serviceType, Reuse.ScopedTo(serviceKey: serviceKey), 
    made: Parameters.Of.Type(_=> param1));

使用此API,我只能在服务构造函数中指定一个原始类型的参数,但不能指定更多参数。我不能使用工厂委托和其他类似的方法,因为我不知道服务类型的细节。

有什么方法可以实现这个场景吗?

更新

我已经使用子范围解决了这个问题。

一些澄清

  • ,我最初的例子并不完全正确。实际上,参数有不同的类型,因此没有ambiguity.
  • ServiceType可以有需要param1和param2的构造函数,或者可能有不需要它们的

构造函数

代码语言:javascript
复制
var container = new Container();

Type serviceType; // some service type
Type serviceKey; // some serviceKey
var param1 = "some param1";
var param2 = 5;

container.Register(serviceType, Reuse.ScopedTo(serviceKey: serviceKey));

////

// parent scope which is created outside
IResolverContext context; 


object service = null;

using (var scope = context.OpenScope("my-child-scope"))
{
   scope.UseInstance(param1);
   scope.UseInstance(param2);

   service = scope.Resolve(serviceType);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-10 16:22:03

按名称使用参数:Parameters.Of.Name(x, ...).Name(y, ...)

或者完全成熟的Made.Of,它接受原始常量(或通过Arg.Index接受任何值):

Made.Of(() => new Blah(param1, param2, Arg.Of<RemainingParamTypeToInject>()))

更新:完整的示例

代码语言:javascript
复制
using System;
using DryIoc;

public class Program
{
    public static void Main()
    {
        var container = new Container();

        // variant 1
        container.RegisterInstance("1", serviceKey: "x");
        container.RegisterInstance("2", serviceKey: "y");
        container.Register<A>(made: Parameters.Of.Name("x", serviceKey: "x").Name("y", serviceKey: "y"));

        // variant 2
        //container.Register<A>(made: Parameters.Of.Name("x", _ => "1").Name("y", _ => "2"));

        var a = container.Resolve<A>();

        Console.WriteLine(a.X + ", " + a.Y);
    }

    public class A 
    {
        public string X, Y;
        public A(string x, string y) 
        {
            X = x;
            Y = y;
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58324048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档