首页 > 解决方案 > 是否可以使用 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 次调用中,要传递给工厂方法的参数应该是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.Ofand的名称空间ServiceInfo.Of,但似乎没有任何迹象表明它可能有用。

请注意,这个问题的有效答案甚至可能是“这是不可能的”。可能没有办法按照我的要求进行操作,并且确实必须进行多个注册,每个策略使用一个。

标签: c#dryioc

解决方案


如果“策略”是指将 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,您在格式字符串之后指定实际参数。这是相同的,但参数可能取决于请求。

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


推荐阅读