c# - 有一种注册服务的方法,它以隐式类型给出,并且构造函数具有多个原始类型的参数
问题描述
我正在使用 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,我只能指定一个原始类型的参数注入到服务的构造函数中,但不能更多。我不能使用工厂委托和其他类似方法,因为我不知道有关服务类型的详细信息。
有什么方法可以实现这个场景?
更新
我已经使用子范围解决了这个问题。
一些说明
我最初的例子并不完全正确。事实上,参数有不同的类型,所以没有歧义。
ServiceType 可以具有需要 param1 和 param2 的构造函数,也可以具有不需要它们的构造函数
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);
}
解决方案
按名称使用参数: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;
}
}
}
推荐阅读
- python - 为大型数据集组合日期、小时和间隔列的更快方法
- python - RegEx如何根据特定位置的字符否定匹配
- html - 如何暂停 CSS 动画
- c# - 使用 HTML 敏捷包进行抓取
- amazon-web-services - 在私有链接的情况下如何使用浏览器客户端连接到雪花
- c++ - c++:MSVC 与 GCC+CLANG:处理 lambdas 捕获类成员变量,正确的方法是什么?
- java - 在Android上将集合转换为数组的最快方法是什么?
- raku - 在 Perl 6 中打印对象
- jekyll - 在 Jekyll 中哪里可以找到默认布局
- angular - Angular Elements 脚本导入与元素参考位置