gpt4 book ai didi

c# - 如何使用 Unity 解决静态类中的依赖关系?

转载 作者:可可西里 更新时间:2023-11-01 03:08:36 30 4
gpt4 key购买 nike

我有以下扩展方法,它(自然地)存在于静态类中。

public static class MyExtensions
{
[Dependency]
private static IMyDataContext _myDataContext { get; set; }

public static void MyExtensionMethod(this MyType myType)
{
// do stuff

_myDataContext.DoAwesomeThing();
}
}

_myDataContext 对象为 null

通常我会使用 UnityContainer 来注册类型,但由于这是一个静态类,所以我不能。

我需要什么来实例化 _myDataContext 以便在我需要它时它不为空?

最佳答案

正如您已经提到的,Unity 不能用于解析类,因为它是静态的。为此有几个选项。我个人最喜欢的是使用抽象工厂模式。我倾向于稍微调整一下模式以便与 DI 配合使用。

工厂通常看起来像这样:

/// <summary>
/// Creates an IMyDataContext instance
/// </summary>
public static class MyDataContextFactory
{
/// <summary>
/// The factory used to create an instance
/// </summary>
static Func<IMyDataContext> factory;

/// <summary>
/// Initializes the specified creation factory.
/// </summary>
/// <param name="creationFactory">The creation factory.</param>
public static void SetFactory(Func<IMyDataContext> creationFactory)
{
factory = creationFactory;
}

/// <summary>
/// Creates a new IMyDataContext instance.
/// </summary>
/// <returns>Returns an instance of an IMyDataContext </returns>
public static IMyDataContext CreateContext()
{
if (factory == null) throw new InvalidOperationException("You can not create a context without first building the factory.");

return factory();
}
}

在您的 Bootstrap 过程中(在您设置服务注册的地方),您可以初始化工厂来解决您的依赖关系。

MyDataContextFactory.SetFactory(() => this.Container.Resolve<IMyDataContext>());

现在在您的扩展方法中,您获取上下文。

public static class MyExtensions
{
public static void MyExtensionMethod(this MyType myType)
{
MyDataContextFactory.CreateContext().DoAwesomeThing();
}
}

你的Unity注册上下文,如果有条件解析它,可以处理服务的各种不同配置。如果上下文有可能由 Unity 以外的其他东西设置,则所有者可以只传入扩展方法将使用的新委托(delegate)。

我倾向于避免将容器本身传递到我的工厂,因为这开始使容器与我的应用程序紧密耦合。如果我要将任何东西传递给工厂,我宁愿它是一个用于通过 DI 解析的工厂委托(delegate),而不是传递 DI 容器本身。

关于c# - 如何使用 Unity 解决静态类中的依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30388081/

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