【问题标题】:C# / ASP.NET MVC dependency injection with data repository isolated from webC#/ASP.NET MVC 依赖注入,数据存储库与 Web 隔离
【发布时间】:2020-01-31 20:37:23
【问题描述】:

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

当前控制器拥有我的数据存储库的所有注入,我想我必须远离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));

具体类 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) 一无所知,如果我从 Windows 服务项目中引用相同的 Data Repository,那么我的具体将被注入而不是调用HttpContext 来获取会话的类可能会调用数据库或其他地方来获取Profile 对象属性。我说的对吗?

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

【问题讨论】:

    标签: c# asp.net-mvc dependency-injection ninject repository-pattern


    【解决方案1】:

    所示设计已经通过抽象分离了关注点。

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

    例如

    //At the Composition Root of Windows Service
    
    //...
    
    windowsServiceKernel
        .Bind(typeof(IAppStateProvider))
        .To(typeof(WindowsServiceAppStateProvider));
    
    //...
    

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 2015-11-08
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多