2009-11-20 64 views
5

Autofac的文档有一个有趣的页面,描述了它自动生成delegate factories的能力。它也强烈地暗示,如果没有Autofac,你可以通过手写来得到类似的结果。如何实施委托工厂?

我正在使用Unity for IoC,并且希望避免将容器传递给需要创建其他对象的对象,那么如何在不使用Autofac的情况下编写委托工厂?

回答

6

嗯,我从来没有用过Unity,所以我的回答很模糊。

校长很简单。您可以定义一些代表工厂的代表。然后你创建一个“工厂”级别,它具有与代表匹配的公共方法。这个班级知道容器。现在您注册委托并将该类设置为实现。然后你可以只注入委托。调用注入的委托时,会调用工厂类,该工厂类知道容器并向容器请求新实例。

首先你定义你的工厂代表。

public delegate TServiceType Provider<TServiceType>(); 
public delegate TServiceType Provider<TArg,TServiceType>(TArg argument); 

将创建一个通用工厂:

/// <summary> 
/// Represents a <see cref="Provider{TArg,TServiceType}"/> which holds 
/// the container context and resolves the service on the <see cref="Create"/>-call 
/// </summary> 
internal class GenericFactory{ 
    private readonly IContainer container; 

    public ClosureActivator(IContainer container) 
    { 
     this.container= container; 
    } 

    /// <summary> 
    /// Represents <see cref="Provider{TServiceType}.Invoke"/> 
    /// </summary> 
    public TService Create() 
    { 
     return container.Resolve<TService>(); 
    } 
    /// <summary> 
    /// Represents <see cref="Provider{TArg,TServiceType}.Invoke"/> 
    /// </summary> 
    public TService Create(TArg arg) 
    {   
     return container.Resolve<TService>(new[] {new TypedParameter(typeof (TArg),arg)}); 
    } 
} 

现在你注册什么的委托,像这样:

var newServiceCreater = new GenericFactory(container); 
container.Register<Provider<MyCompoent>>().To(newServiceCreater.Create); 

var newServiceCreater = new GenericFactory(container); 
container 
    .Register<Provider<OtherServiceWithOneArgumentToConstruct>>() 
    .To(newServiceCreater.Create); 

现在等你注入其他组件只是“供应商'而不是容器。

+0

这让我开始了 - 非常感谢! – GraemeF 2009-11-23 16:24:40