gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:37:09 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com