c# - 如何实现委托(delegate)工厂?

标签 c# inversion-of-control unity-container factory autofac

Autofac 的文档有一个有趣的页面描述了它自动生成 delegate factories 的能力.它还强烈建议您在没有 Autofac 的情况下通过手写获得类似的结果。

我正在为 IoC 使用 Unity,并且希望避免将容器传递给需要创建其他对象的对象,那么如果没有 Autofac,您将如何编写委托(delegate)工厂?

最佳答案

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

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

首先定义工厂委托(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)});
    }
}

现在你注册委托(delegate),像这样:

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)其他组件即可。

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

相关文章:

C# - 使用另一个字符串数组中的字符串搜索字符串数组

c# - 在哪里可以找到 Windows 中的默认 Winforms 图标?

c# - 如何在 C# 中执行 Convert.ToDateTime 或解析日期,但在 C# 2.0 中仅获取 dd/mm/yyyy?

c# - 如何使用 StructureMap 将不同的混凝土绑定(bind)到属性

c# - 使用带有 Dependency 关键字和 UnityContainer 的属性进行初始化

c# - 统一注册相互覆盖

c# - 如何以编程方式(C# 或 Java)在 Windows 中启动应用程序并在其窗口中调用点击?

asp.net-mvc - 在 DI 容器中配置时,MVC Controller 应该获得什么样的生活方式

.net - 构造函数注入(inject)替代方案(温莎城堡)

c# - 使用 Prism 设置数据上下文