Castle Windsor Typed Factory Facility等同物

时间:2010-11-06 14:00:17

标签: castle-windsor unity-container ninject autofac abstract-factory

是否有任何其他.NET IoC容器为Castle Windsor中的类型化工厂提供了相同的功能?

e.g。如果我在WPF应用程序中使用抽象工厂模式:

public class MyViewModel
{
   private IAnotherViewModelFactory factory;

   public void ShowAnotherViewModel()
   {
      viewController.ShowView(factory.GetAnotherViewModel());
   }
}

我不想为我希望展示的每种类型的ViewModel创建IAnotherViewModelFactory的手动实现,我希望容器能够为我处理这个问题。

3 个答案:

答案 0 :(得分:6)

AutoFac有一个名为Delegate Factories的功能,但据我所知,它仅适用于代理,而不适用于接口。

我没有在StructureMap和Unity中遇到类似Castle的Typed Factory Facility,但这并不一定意味着他们不在那里......


我能想象可以通过动态代理实现接口的唯一方法。由于Castle Windsor有一个动态代理,但很少有其他容器有类似的东西,这可能有很长的路要解释为什么这个功能无处不在。

Unity还提供拦截功能,因此它必须具有某种动态代理实现,但我很确定它没有任何与Typed Factories相同的功能。与其他容器相比,Unity非常基本。

答案 1 :(得分:3)

在Autofac中,您可以在委托方法Mark提及的基础上实现类型化工厂。 E.g。

class AnotherViewModelFactory : IAnotherViewModelFactory {
    Func<AnotherViewModel> _factory;
    public AnotherViewModelFactory(Func<AnotherViewModel> factory) {
        _factory = factory;
    }
    public AnotherViewModel GetAnotherViewModel() {
        return _factory();
    }
}

如果此类已在容器中注册,则AnotherViewModel Autofac将隐式提供Func<AnotherViewModel>实现:

builder.RegisterType<AnotherViewModel>();
builder.RegisterType<AnotherViewModelFactory>()
    .As<IAnotherViewModelFactory>();

实际上,您可以使用Typed Factory Facility实现的任何接口都可以使用这种方法在Autofac中实现。主要区别在于Windsor实现通过组件注册API配置工厂,而在Autofac中,工厂本身就是一个组件。

有关更复杂的示例,您可能希望看一下:http://code.google.com/p/autofac/wiki/RelationshipTypeshttp://nblumhardt.com/2010/01/the-relationship-zoo/

答案 2 :(得分:1)

我最近为Unity实施了相当于Castle Windsor Typed Factories。您可以在https://github.com/PombeirP/Unity.TypedFactories找到项目,在http://nuget.org/packages/Unity.TypedFactories找到NuGet包。

用法如下:

unityContainer
    .RegisterTypedFactory<IFooFactory>()
    .ForConcreteType<Foo>();

参数匹配是通过名称完成的,这对我的需求很好,尽管可以轻松扩展库以支持其他需求。