C# / ASP.NET MVC 依赖注入,数据存储库与 Web 隔离

C# / ASP.NET MVC dependency injection with data repository isolated from web

我有一个 C# 和 ASP.NET MVC 项目,使用 Repository 模式和 Ninject。

当前的控制器有我的数据存储库的所有注入,我想我必须远离 System.Web 程序集,因为数据存储库应该只知道数据库而不是其他。

检查我的代码后,我发现我依赖于 AppStateProvider:

public class AppStateProvider : IAppStateProvider
{
    public Profile AppState
    {
        get
        {
            Profile appState = null;
            if (HttpContext.Current != null && HttpContext.Current.Session["appstate"] != null)
            {
                appState = (Profile )HttpContext.Current.Session["appstate"];
            }
            return appState;
        }
    }
}

这个依赖在我的NinjectWebCommon.cs:

中注册
  kernel.Bind(typeof(IAppStateProvider)).To(typeof(Helpers.AppStateProvider));

具体 class AppStateProvider 位于我的 Web 项目中的 Helpers 文件夹中。

现在,在我的数据项目中,我有以下注入依赖项的存储库。

public class EmployeeRepository : IEmployeeRepository
{
    ILogManager _logManager = null;
    private readonly Profile _appState;

    public EmployeeRepository (IAppStateProvider appStateProvider, ILogManager logManager)
    {
        _appState = appStateProvider.AppState;
        _logManager = logManager;
    }

   // some methods here!!
}

所以,我想我做的是正确的方法,因为 Data Repository 仍然对应用程序上下文 (HttpContext) 一无所知,如果我引用相同的 Data Repository从 Windows 服务项目然后我的具体 class 将被注入而不是调用 HttpContext 来获取会话可能调用数据库或其他地方来获取 Profile 对象 属性。我说得对吗?

有没有一种方法可以将依赖项从我的控制器传递给 Profile 对象,而不是将其作为参数传递给每个方法,例如传递也许它是一个 属性 对象?

显示的设计已经通过抽象分离关注点。

windows 服务项目的组合根只需要注册所需的具体实现。

例如

//At the Composition Root of Windows Service

//...

windowsServiceKernel
    .Bind(typeof(IAppStateProvider))
    .To(typeof(WindowsServiceAppStateProvider));

//...

具体 WindowsServiceAppStateProvider 实现位于 windows 服务项目中。

数据存储库已通过构造函数注入明确声明其所需的依赖项。

这里没有其他真正需要更改的地方。