Singleton注入一个在请求的生命周期内持续存在的类

时间:2017-01-25 14:58:43

标签: c# asp.net dependency-injection unity-container

我有一个包含以下类的ASP.NET Web应用程序:

public class AppContext : IAppContext {
    private readonly IDataContext _dataContext;

    public AppContext(IDataContext dataContext) {
        _dataContext = dataContext;
    }

    ...
}

public class DataContext : IDataContext {
    ...
}

这些是使用Untity注册的,如下:

container.RegisterType<IAppContext, AppContext>(new ContainerControlledLifetimeManager());
container.RegisterType<IDataContext, DataContext>(new PerRequestLifetimeManager());

AppContext是一个单例并且在应用程序的生命周期中存在,但DataContext仅在当前请求的生命周期内存在。

但是,由于DataContext是在AppContext类的构造函数中注入的,因此它将在请求之间保持不变。这会导致问题问题,因为DataContext在请求结束后处理。我怎么能在AppContext类中注入DataContext,以便我可以检索正确的实例?

1 个答案:

答案 0 :(得分:2)

这意味着AppContext的整个设计都是无效的,它应该按照请求生存,因为现在依赖来处理某些实际的请求数据上下文。

作为解决方案,将其拆分为包含共享逻辑的单例类,以及依赖于数据上下文和共享逻辑的逻辑类。

public class SingletonAppContext : ISingletonAppContext //as singleton
{
    //Source code where no data context needed
}

public class RequestAppContext : IRequestAppContext
{
    public RequestAppContext(ISingletonAppContext appContext, IDataContext dataContext)
    {
    }

    //Source code where data context is needed
}