如何在Unity中解决静态类的依赖

本文关键字:静态类 依赖 解决 Unity | 更新日期: 2023-09-27 17:50:18

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

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中解决静态类的依赖

正如你已经提到的,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();
    }
}

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

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

现在在你的扩展方法中,你获取一个上下文。

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

你的Unity注册的上下文,可以处理各种不同的配置的服务,如果有条件来解决它。如果有可能上下文可以由Unity以外的东西设置,那么所有者可以传入一个扩展方法将使用的新委托。

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