4

我有一个像下面这样的接口,我将它注入到统一容器中。

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可以做类似的事情吗?

4

2 回答 2

3

一个用于 Unity 的 Castle Windsor Typed Factory 港口。它将生成您的接口的实现并ResolveAll为您完成。

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

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

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

该端口遵循为 Windsor 描述的相同约定。

于 2012-12-06T20:42:18.740 回答
0

将容器传递给工厂没有任何问题,如果工厂作为单例公开,这样就可以很好地获取实例,而无需再次传递容器。

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

于 2012-12-06T18:50:33.880 回答