c# - 是否可以使用 DryIoc 传递解析为工厂方法时使用的策略?
问题描述
我正在尝试使用工厂将对象注册到DryIoc容器。
void Main()
{
var container = new Container();
container.Register<IFactory, Factory>();
container.Register<IService>(
made: Made.Of(r => ServiceInfo.Of<IFactory>(), f => f.Create("default")));
container.Resolve<IService>().Dump();
container.Resolve<IService>("name1").Dump();
container.Resolve<IService>("name2").Dump();
}
public interface IFactory
{
IService Create(string name);
}
public class Factory : IFactory
{
public IService Create(string name) => new Service(name);
}
public interface IService
{
string Name { get; }
}
public class Service : IService
{
public Service(string name) => Name = name;
public string Name { get; }
}
我希望解析期间使用的策略是传递给工厂方法的参数。在上面的代码中,我将此参数硬编码为"name"
,但我希望使用策略来代替。具体来说,在 Resolve 的第 2 次和第 3 次调用中,要传递给工厂方法的参数应该是name1
和name2
。
解析的 3 次调用仅在第一次调用时成功,其他两次失败是因为容器中没有使用策略name1
或name2
. 现在,我知道策略可以是所有类型的对象,而不仅仅是字符串,但即便如此,我也希望它适用于我的情况。
那么有没有办法调整注册调用以获取策略并将其注入工厂方法:
container.Register<IService>(
made: Made.Of(r => ServiceInfo.Of<IFactory>(), f => f.Create(<what to put here>)));
^
|
... +-----------------------------------------+
|
container.Resolve<IService>("name1");
我查看了我拥有Arg.Of
and的名称空间ServiceInfo.Of
,但似乎没有任何迹象表明它可能有用。
请注意,这个问题的有效答案甚至可能是“这是不可能的”。可能没有办法按照我的要求进行操作,并且确实必须进行多个注册,每个策略使用一个。
解决方案
如果“策略”是指将 aserviceKey
作为参数传递给工厂方法,则可以这样做。
您需要Arg.Index(int)
为工厂方法指定自定义参数:
它可能看起来像这样:
container.Register<IService>( made: Made.Of(r => ServiceInfo.Of<IFactory>(),
f => f.Create(Arg.Index(0)),
r => r.ServiceKey));
Arg.Index(0)
工作方式类似于{0}
placeholder in string.Format
,您在格式字符串之后指定实际参数。这是相同的,但参数可能取决于请求。
抱歉,如果它没有立即编译,则无法访问笔记本电脑进行验证。
推荐阅读
- python - auc = roc_auc_score(y_test, probs) 代码中的错误
- json - 如何使用jq根据json中的值进行分组?
- wordpress - 查看自定义帖子类型类别时出现 404 页面错误
- html - Dropmenu 问题不使用 html 和 css 显示
- node.js - 记录事件源失败
- transactions - 如何识别在销售期间或以折扣价购买的交易
- bash - 通过 bash 脚本验证日期时间(即 '20200204a')
- javascript - 根据 URL 路径动态改变数据层事件
- c - 查找使用按位运算编码的两组数字之间的交集的最有效方法
- python - 是否可以旋转数据框并获得每月汇总?