我正在尝试越来越熟悉 DI 和 IoC。此时此刻,我了解了 DI 在 MVC 应用程序中使用 Controller 的概念和实现。但假设我有一个分层应用程序。 Controller 调用业务逻辑类,业务逻辑类调用存储库类。
我如何设置第二层,业务逻辑到存储库部分与 DI。这确保我可以在应用程序的不同级别上进行测试。我不想做的是将依赖项从 Controller 传递到存储库。
希望有人能给出一些提示。
帕特里克
最佳答案
如何使用 Ninject 实现的简约示例.这不是关于 DI/IoC 的绝对真理,只是一个可以如何完成的简短示例。
配置
// repositories
base.Bind<IMyRepository>().To<MyRepository>();
// services
base.Bind<IMyServices>().To<MyServices>();
当使用 IMyRepository
时,它将使用具体实现 MyRepository
。
Controller
public class MyController : Controller
{
private readonly IMyServices _myServices;
public AnimalController(IMyServices myServices)
{
_myServices = myServices;
}
// your actions
}
同样,在 MyService
中有一个类似的模式(构造函数注入(inject))
服务
public class MyServices : IMyServices
{
private readonly IMyRepository _myRepository;
public MyServices(IMyRepository myRepository)
{
_myRepository = myRepository;
}
public void Example()
{
_myRepository.PleaseDoSomething();
}
}
还要记住,在 ASP.NET MVC 中还有许多其他可以使用 IoC 的地方:
- 本地化
- 授权
- 模型元数据提供者(例如本地化错误消息)
- 自定义模型 Binder
- Controller 工厂
- 等等
更新
示例代码中存在错误。服务中没有进行依赖注入(inject)。现在它应该是正确的。
更新 2
我认为强烈建议使用 NuGet 包来引导您的应用程序。节省时间,可能会应用一些“最佳实践”,其他项目将获得类似的基础等。这里有一些针对不同 IoC + MVC 3 的说明
关于c# - asp.net mvc中的两层依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9531997/