代码之家  ›  专栏  ›  技术社区  ›  devdigital

城堡温莎型工厂设施等效物

  •  7
  • devdigital  · 技术社区  · 14 年前

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

    public class MyViewModel
    {
       private IAnotherViewModelFactory factory;
    
       public void ShowAnotherViewModel()
       {
          viewController.ShowView(factory.GetAnotherViewModel());
       }
    }
    

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

    3 回复  |  直到 14 年前
        1
  •  7
  •   Mark Seemann    14 年前

    AutoFac有一个称为 Delegate Factories

    我在StructureMap和Unity中都没有遇到过类似Castle的工厂设施,但这并不一定意味着他们不在那里。。。


    我能想象的唯一方法是通过一个动态代理来实现这样的接口。由于Castle Windsor有一个动态代理,但很少有其他容器有类似的功能,这可能会很大程度上解释为什么这个功能并不普遍。

    Unity还提供了截取功能,因此它必须有某种动态代理实现,但我敢肯定它没有任何类型的工厂。与其他容器相比,统一性是相当基本的。

        2
  •  3
  •   Tim Cooper    13 年前

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

    如果这个类是在容器中注册的,那么 AnotherViewModel Func<AnotherViewModel> 隐式实现:

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

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

    对于更复杂的示例,您可能希望查看: http://code.google.com/p/autofac/wiki/RelationshipTypes http://nblumhardt.com/2010/01/the-relationship-zoo/ .

        3
  •  1
  •   Pedro Pombeiro    12 年前

    我最近为Unity设计了一个类似于Castle Windsor的工厂。你可以在 https://github.com/PombeirP/Unity.TypedFactories http://nuget.org/packages/Unity.TypedFactories .

    用法如下:

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