Unity工厂注射

时间:2012-12-06 18:02:08

标签: c# unity-container castle

我有一个类似下面的界面,我注入了统一容器。

public interface IMyInstanceFactory
{
    IEnumerable<IMyInstance> GetAll();
}

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

public class MyInstanceFactory:IMyInstanceFactory
{
    IUnityContainer _container;

    public MyInstanceFactory(IUnityContainer container)
    {
        _container = container;
    }
    public IEnumerable<IMyInstance> GetAll()
    {
        return _container.ResolveAll<IMyInstance>();
    }
}

..在我的引导程序中,我做了类似的事情:

container.RegisterType<IMyInstance,MyInstance1>;
container.RegisterType<IMyInstance,MyInstance2>;
container.RegisterType<IMyInstance,MyInstance3>;
container.RegisterType<IMyInstanceFactory,MyInstanceFactory>;

这可以很好地解决所有问题。但是,我不想依赖于容器或仅为此实现IMyInstanceFactory,有没有一种方法可以在不实现IMyInstanceFactory的情况下进行设置? Unity是否为此提供了便利?

这种东西..

container.RegisterType<IMyInstanceFactory,factory=>factory.GetAll()>().IsResolvedBy(unity.ResolveAll<IMyInstance>);

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

2 个答案:

答案 0 :(得分:3)

a port of the Castle Windsor Typed Factory Facilities for Unity。它将生成您的界面实现并为您执行ResolveAll

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

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

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

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

答案 1 :(得分:0)

将容器传递给工厂没有任何问题,如果将工厂暴露为单件,这样就可以很好地使得实例不需要再次传递容器。

另一个选择是在工厂中使用服务定位器解析容器,因为定位器是单例,这种方法类似于前者。