Unity工厂注入

Mik*_*ike 5 c# castle unity-container

我有一个如下所示的接口,我将其注入到统一容器中。

public interface IMyInstanceFactory
{
    IEnumerable<IMyInstance> GetAll();
}
Run Code Online (Sandbox Code Playgroud)

所有这些IMyInstance在运行时之前都是已知的,即它们可以在引导程序中设置,并且可以从统一中检索。我的具体实现IMyInstanceFactory如下:

public class MyInstanceFactory:IMyInstanceFactory
{
    IUnityContainer _container;

    public MyInstanceFactory(IUnityContainer container)
    {
        _container = container;
    }
    public IEnumerable<IMyInstance> GetAll()
    {
        return _container.ResolveAll<IMyInstance>();
    }
}
Run Code Online (Sandbox Code Playgroud)

..在我的引导程序中我做了这样的事情:

container.RegisterType<IMyInstance,MyInstance1>;
container.RegisterType<IMyInstance,MyInstance2>;
container.RegisterType<IMyInstance,MyInstance3>;
container.RegisterType<IMyInstanceFactory,MyInstanceFactory>;
Run Code Online (Sandbox Code Playgroud)

这一切都完美地解决了。但是,我不想依赖容器本身或IMyInstanceFactory为此实现,有没有办法可以在不实现的情况下进行设置IMyInstanceFactory?Unity 是否为此提供了便利?

诸如此类的东西..

container.RegisterType<IMyInstanceFactory,factory=>factory.GetAll()>().IsResolvedBy(unity.ResolveAll<IMyInstance>);
Run Code Online (Sandbox Code Playgroud)

我知道 castle 可以做到这一点,Unity 可以做类似的事情吗?

Seb*_*ber 3

一个用于 Unity 的温莎城堡类型工厂设施的端口。它将生成您的接口的实现并ResolveAll为您执行此操作。

您的引导代码应该如下所示:

container.RegisterType<IMyInstance,MyInstance1>("1");
container.RegisterType<IMyInstance,MyInstance2>("2");
container.RegisterType<IMyInstance,MyInstance3>("3");
container.RegisterType<IMyInstanceFactory>(new TypedFactory());
Run Code Online (Sandbox Code Playgroud)

对 的调用GetAll将被转换为容器调用ResolveAll

该端口遵循与 Windsor 相同的约定。