asp.net-mvc – 如何告诉Ninject绑定到它没有引用的实现
|
我在我的ASP.NET MVC3项目中使用 NinjectMVC3. 我有3层 > Foo.Web Foo.Web引用Foo.Services但不引用Foo.Data.我的一个服务看起来像这样 public class FooService : IFooService
{
private readonly IFooRepository _fooRepository;
public FooService(IFooRepository fooRepository)
{
_fooRepository = fooRepository;
}
// ...
}
NinjectMVC3在Foo.Web启动时执行此引导方法 private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IFooService>().To<FooService>();
kernel.Bind<IFooRepository>().To<FooRepository>();
// Foo.Web doesn't know what FooRepository is
}
如何从Foo.Web注入FooServices依赖项? 解决方法为了让你指向正确的方向,我建议你看看 onion architecture.它的基本前提是任何代码都可以依赖于更加集中的层.在您的场景中(对于使用Repository模式的MVC3应用程序而言,它是常见的),您的UI应该具有对服务层的引用,并且可以接受对数据层的引用. 如果你愿意接受(如果你来自经典的N层设置,这是一个难以吞咽的药丸,我知道),那么你的情况变得更加简单. 使用Ninject,您现在可以执行以下操作: 在您的NinjectMVC3.cs文件中,您的CreateKernel变为 /// <summary>
/// Creates the kernel that will manage your application.
/// </summary>
/// <returns>The created kernel.</returns>
private static IKernel CreateKernel()
{
var modules = new INinjectModule[]
{
new ServiceDIModule(),new RepositoryDIModule()
};
var kernel = new StandardKernel(modules);
//RegisterServices(kernel); <-- Only if you have some custom binding
// that are UI specific
return kernel;
}
现在,在您的服务层中,添加对Ninject的引用(通过NuGet只是简单的Ninject,而不是通过NuGet的MVC3 dropin),并添加我在ServiceDIModule上面调用的内容,如下所示: using Ninject.Modules;
namespace MyServiceLayer
{
public class ServiceDIModule : NinjectModule
{
public override void Load()
{
//Bind Services
Bind<IPracticeService>().To<PracticeService>().InRequestScope();
}
}
}
并重复相同的数据层注入过程(UnitofWork,DatabaseFactory,IFooRepository等) namespace MyDataLayer
{
public class RepositoryDIModule : NinjectModule
{
public override void Load()
{
//Bind Repos
Bind<IFooRepository>().To<FooRepository>().InRequestScope();
}
}
}
现在,您可以预先访问所需的所有绑定.所以,你对我的问题实际上归结为思维的转变.如果您可以接受(不情愿或其他方式)洋葱概念,您的方案将干净利落地解决. 您还可以查看Project Silk和CodeCampServer.它们都在某种程度上实现了“洋葱”概念(Silk肯定,我现在正在寻找解决方案,UI web项目包含对包含所有回购) 让我知道你的想法. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 自定义异常过滤器在asp.net MVC中没有被击中
- asp.net – 如何将最新的TFS变更集编号插入到aspx页面?
- asp.net-mvc – MVC / Razor – 当有下列括号时,Intellisen
- 过期输出缓存ASP.Net MVC
- asp.net-mvc – FileStreamResult和FilePathResult之间的区
- asp.net-mvc – MVC3中Textbox的水印
- asp.net-mvc-2 – 在MVC中实现自定义标识和IPrincipal
- asp.net-mvc-4 – 为什么MVC4 @ Styles.Render()在调试模式
- asp.net-mvc-3 – 在同一视图中更新多个项目
- asp.net-mvc – 维护消息完整性
- asp.net – jquery下拉选择器AutoPostback
- asp.net-mvc – 传统的ASP.NET Web窗体与MVC
- asp.net – 如何配置IIS以接受POST请求?
- asp.net-mvc-4 – MVC 4 – 从视图中的Controlle
- asp.net-mvc – 未找到部分视图或视图引擎不支持
- .net – ReportViewer 2010无法评估表达式
- ASP.NET 2.0 – 带有tbody / thead的DataGrid
- asp.net-mvc – ASP.NET MVC中的Flat和Nested Vi
- asp.net – 控制器SessionStateBehavior是ReadOn
- asp.net – 从wsdl生成webservice
