是否有任何其他.NET IoC容器为Castle Windsor中的类型化工厂提供了相同的功能?
e.g。如果我在WPF应用程序中使用抽象工厂模式:
public class MyViewModel
{
private IAnotherViewModelFactory factory;
public void ShowAnotherViewModel()
{
viewController.ShowView(factory.GetAnotherViewModel());
}
}
我不想为我希望展示的每种类型的ViewModel创建IAnotherViewModelFactory的手动实现,我希望容器能够为我处理这个问题。
答案 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/RelationshipTypes和http://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>();
参数匹配是通过名称完成的,这对我的需求很好,尽管可以轻松扩展库以支持其他需求。