我使用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);
}发布于 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>()))
更新:完整的示例
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;
}
}
}https://stackoverflow.com/questions/58324048
复制相似问题