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

IoC与动态对象

  •  3
  • Andreas  · 技术社区  · 16 年前

    我很难找出如何解析依赖于运行时不确定创建的对象的对象。什么是最好的方法?

    想象一下文字处理器。对于打开的每个文档,可能需要创建大量依赖于该文档对象的对象。

    例如,您希望获取DocumentEditor的实例:

    public class DocumentEditor {
        public DocumentEditor(IDocument document, 
                              ISpellChecker spellChecker, 
                              IWordCounter wordCounter) {
            ...
        }
    }
    

    使用被注入的工厂

    这种方法的问题是,您最终可以为需要创建的每种类型创建一个工厂。即。

    public interface ISpellCheckerFactory {
        ISpellChecker Create(IDocument document);
    }
    
    public interface IWordCounterFactory {
        IWordCounter Create(IDocument document);
    }
    
    public class DocumentEditorFactory {
        public DocumentEditorFactory(ISpellCheckerFactory spellCheckerFactory,
                                     IWordCounterFactory wordCounterFactory) {
            ...
        }
    
        public DocumentEditor Create(IDocument document) {
            ...
        }
    }
    

    使用嵌套容器

    使用嵌套容器无需创建无数工厂。它实际上相当紧凑(例如使用Unity):

    var child = container.CreateChildContainer();
    child.RegisterInstance<IDocument>(theDocument);
    child.Resolve<DocumentEditor>();
    

    这种方法的缺点是容器到处都漏。

    How to register types in the main container, but resolve in a child container? )

    应该可以通过实现一个DocumentEditorFactory来将两者结合起来,这个DocumentEditorFactory创建嵌套容器并使用子容器来解析依赖关系。

    分析瘫痪的最佳状态。。。

    4 回复  |  直到 8 年前
        1
  •  1
  •   Rashack    16 年前

    在autofac中有一种方法叫做 DelegateFactories . 它有点类似于您的第一个选项,但删除了大量的手工编码。

        2
  •  0
  •   idursun    16 年前

    AutoFac ,因为它在这些跟踪问题上非常成熟。您将服务注册到ContainerBuilder,并且您所构建的容器根据其作用域跟踪您所请求的对象。每件标着 ContainerScoped 将在容器被释放时被释放。所以你可以为每个 DocumentEditor

    http://code.google.com/p/autofac/wiki/NuancesOfTracking

        3
  •  0
  •   Runcible    16 年前

    使用被注入的工厂

    这种方法的问题是 需要创建的类型。

    关于依赖注入,这是一个常见的神话。 I highly recommend Misko Hevery's article regarding the new operator . 简而言之:您只需要为每个生命周期创建一个工厂,而不是为每种类型创建一个工厂。

        4
  •  -1
  •   Anton Gogolev    16 年前

    尝试 MEFy 方法:你可以 SpellChecker WordCounter IDocumentEditorExtension

    IDocumentEditor editor = Registry.Resolve<IDocumentEditor>();
    IDocumentEditorExtension[] extensions = Registry.ResolveAll<IDocumentEditorExtension>();
    
    extensions.ForEach((e) => e.AttachTo(editor));