首页 > 解决方案 > 有一种注册服务的方法,它以隐式类型给出,并且构造函数具有多个原始类型的参数

问题描述

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

我试过以下


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,我只能指定一个原始类型的参数注入到服务的构造函数中,但不能更多。我不能使用工厂委托和其他类似方法,因为我不知道有关服务类型的详细信息。

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

更新

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

一些说明

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);
}

标签: c#dryioc

解决方案


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

或者Made.Of接受原始常量(或通过任何值Arg.Index)的完整版本:

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

更新:完整示例

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;
        }
    }
}

推荐阅读