C# 如何实现代理工厂?

C# 如何实现代理工厂?,c#,inversion-of-control,unity-container,factory,autofac,C#,Inversion Of Control,Unity Container,Factory,Autofac,的文档有一个有趣的页面,描述其自动生成的能力。它还强烈建议,不使用Autofac,您可以通过手工书写获得类似的结果 我正在使用Unity for IoC,希望避免将容器传递给需要创建其他对象的对象,因此,如果没有Autofac,您将如何编写代理工厂?到目前为止,我从未使用Unity,因此我的答案非常模糊 原则很简单。您可以定义一些代表工厂的委托。然后创建一个“工厂”类,该类具有与委托匹配的公共方法。这个类知道容器。现在注册委托并将该类设置为实现。然后您只能注入委托。调用注入的委托时,将调用fac

的文档有一个有趣的页面,描述其自动生成的能力。它还强烈建议,不使用Autofac,您可以通过手工书写获得类似的结果


我正在使用Unity for IoC,希望避免将容器传递给需要创建其他对象的对象,因此,如果没有Autofac,您将如何编写代理工厂?

到目前为止,我从未使用Unity,因此我的答案非常模糊

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

首先定义工厂代理

public delegate TServiceType Provider<TServiceType>();
public delegate TServiceType Provider<TArg,TServiceType>(TArg argument);
公共委托TServiceType提供程序();
公共委托TServiceType提供程序(TArg参数);
创建常规工厂时,需要执行以下操作:

/// <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)});
    }
}
//
///表示一个
///容器上下文并解析-调用上的服务
/// 
内部类泛型工厂{
专用只读IContainer容器;
公共ClosureActivator(IContainer容器)
{
this.container=container;
} 
/// 
///代表
/// 
公共t服务创建()
{
返回container.Resolve();
}
/// 
///代表
/// 
公共服务创建(TArg arg)
{        
返回container.Resolve(new[]{newtypedparameter(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);
var newServiceCreater=新的通用工厂(容器);
container.Register().To(newServiceCreater.Create);
var newServiceCreater=新的通用工厂(容器);
容器
.Register()
.To(newServiceCreater.Create);
现在,您只需将“提供者”而不是容器注入其他组件