Autofac的文档中有一个有趣的页面,描述了其自动生成delegate factories的能力。它也强烈建议您通过手动编写可以在没有Autofac的情况下获得相似的结果。

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

最佳答案

好吧,到目前为止,我从未使用过Unity,所以我的回答很模糊。

原理很简单。您定义一些代表工厂的代表。然后,创建一个“工厂”类,该类具有与委托(delegate)匹配的公共(public)方法。此类知道容器。现在,您注册委托(delegate)并将该类设置为实现。然后,您只能注入(inject)委托(delegate)。调用注入(inject)的委托(delegate)时,将调用工厂类,该类知道容器并向容器询问新实例。

首先,定义工厂代理。

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);

现在,其他人只需注入(inject)“提供者”而不是容器即可注入(inject)其他组件。

关于c# - 如何实现代表工厂?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1770113/

10-16 05:18