我正在尝试使用工厂将对象注册到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的第二次和第三次调用中,要传递给工厂方法的参数应该分别为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
和ServiceInfo.Of
的命名空间,但是似乎没有任何迹象表明它可能有用。
请注意,此问题的有效答案甚至可能是“这是不可能的”。可能是没有办法按照我的要求去做,实际上确实必须有多个注册,每个策略才能使用一个。
答案 0 :(得分:1)
如果“策略”是指将library(RANN)
sp.data <- data
coordinates(sp.data) <- ~lon+lat
sf.data <- st_as_sf(sp.data)
dist_m <- st_distance(sf.data, sf.data)
index <- apply(dist_m, 1, order)
index <- index[2:nrow(index), ]
index <- index[1, ]
index2 <- as.data.frame(index)
index2 <- data.frame(t(index2))
作为工厂方法的参数传递,则可以执行此操作。
您需要使用serviceKey
为工厂方法指定自定义参数:
它可能看起来像这样:
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}
占位符相似,在占位符中您可以在格式字符串之后指定实际参数。一样,但是参数可能取决于请求。
抱歉,如果无法立即编译,则无法访问笔记本电脑进行验证。