是否可以使用DryIoc将解析为工厂方法时使用的策略传递给我们?

时间:2018-10-25 13:33:33

标签: 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的第二次和第三次调用中,要传递给工厂方法的参数应该分别为name1name2

这3个呼叫仅在第一个呼叫中成功,而其他两个则失败,因为在容器中没有使用策略name1name2的注册。现在,我知道策略可以是所有类型的对象,而不仅是字符串,而且即使如此,我也希望它适用于我的情况。

因此,有什么方法可以调整注册调用以采用该策略并将其注入工厂方法:

container.Register<IService>(
    made: Made.Of(r => ServiceInfo.Of<IFactory>(), f => f.Create(<what to put here>)));
                                                                         ^
                                                                         |
...                            +-----------------------------------------+
                               |
container.Resolve<IService>("name1");

我已经查看了拥有Arg.OfServiceInfo.Of的命名空间,但是似乎没有任何迹象表明它可能有用。

请注意,此问题的有效答案甚至可能是“这是不可能的”。可能是没有办法按照我的要求去做,实际上确实必须有多个注册,每个策略才能使用一个。

1 个答案:

答案 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}占位符相似,在占位符中您可以在格式字符串之后指定实际参数。一样,但是参数可能取决于请求。

抱歉,如果无法立即编译,则无法访问笔记本电脑进行验证。