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

C# 如何用Unity解决静态类中的依赖关系?,c#,unity-container,extension-methods,C#,Unity Container,Extension Methods,我有以下扩展方法,它(自然)存在于静态类中 public static class MyExtensions { [Dependency] private static IMyDataContext _myDataContext { get; set; } public static void MyExtensionMethod(this MyType myType) { // do stuff _myDataContext.D

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

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

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

        _myDataContext.DoAwesomeThing();
    }
}
\u myDataContext
对象为空

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


我需要什么来实例化myDataContext,以便在我需要它时不为null?

正如您已经提到的,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();
    }
}
您的上下文统一注册可以处理服务的各种不同配置(如果有条件解决它)。如果上下文可能是由Unity以外的东西设置的,那么所有者可以传入扩展方法将使用的新委托


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

如何使上述实现通用?我想传递任何接口吗?IMyDataContext可以是任何接口。您可以提供任何实现吗?您只需将
SetContext
CreateContext
方法设置为通用方法即可。您的实现将解析
,而不是
IDataContext
。您必须存储
Func
MyDataContextFactory.SetFactory(() => this.Container.Resolve<IMyDataContext>());
public static class MyExtensions
{
    public static void MyExtensionMethod(this MyType myType)
    {
        MyDataContextFactory.CreateContext().DoAwesomeThing();
    }
}