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 服务项目中。
数据存储库已通过构造函数注入明确声明其所需的依赖项。
这里没有其他真正需要更改的地方。
我有一个 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 服务项目中。
数据存储库已通过构造函数注入明确声明其所需的依赖项。
这里没有其他真正需要更改的地方。