Lut*_*cka 18 asp.net-mvc ninject-2 asp.net-mvc-3
我正在尝试使用MVC 3中的ninject将存储库注入自定义成员资格提供程序.
在MembershipProvider中,我尝试了以下内容:
[Inject]
public ICustomerRepository _customerRepository{ get; set; }
Run Code Online (Sandbox Code Playgroud)
和
[Inject]
public TUMembershipProvider(ICustomerRepository customerRepository)
{
_customerRepository = customerRepository;
}
Run Code Online (Sandbox Code Playgroud)
在我的ninject模块中,我尝试了以下方法:
Bind<MembershipProvider>().ToConstant(Membership.Provider);
Run Code Online (Sandbox Code Playgroud)
以上都不是.
当我使用(在global.asa)
kernel.Inject(Membership.Provider);
Run Code Online (Sandbox Code Playgroud)
和...一起
[Inject]
public ICustomerRepository _customerRepository{ get; set; }
Run Code Online (Sandbox Code Playgroud)
它有效,但我没有生命周期管理,这将导致NHibernate的"ISession is open"错误,因为ISession是InRequestScope而存储库不是.
您可以在他关于提供者注入的博客文章中使用@Remo Gloor概述.它涉及3个步骤:
将[Inject]s 添加到您需要注入的提供者的任何属性中(尽管他显示的模式 - 创建一个非常简单的类,其唯一的功能是接受属性注入,并将任何请求转发给使用构造函数注入实现的实际类)值得关注)
public class MyMembershipProvider : SqlMembershipProvider
{
[Inject]
public SpecialUserProvider SpecialUserProvider { get;set;}
...
Run Code Online (Sandbox Code Playgroud)创建一个初始化器包装器,它实现IHttpModule了拉动提供者,触发它的创建: -
public class ProviderInitializationHttpModule : IHttpModule
{
public ProviderInitializationHttpModule(MembershipProvider membershipProvider)
{
}
...
Run Code Online (Sandbox Code Playgroud)注册IHttpModule您的RegisterServices: -
kernel.Bind<IHttpModule>().To<ProviderInitializationHttpModule>();
Run Code Online (Sandbox Code Playgroud)没有4; Ninject完成剩下的工作 - IHttpModules在启动过程中自动引导所有已注册的,包括你添加的那个.
(不要忘记阅读博客文章上的评论重生时间等)
最后,如果您正在寻找完全解决问题的脑力直接解决方案,请尝试使用@Remo Gloor答案
PS对整个混乱的一个很好的写法是提供者不是@Mark Seemann的模式.(以及他优秀书籍的代号插件: - .NET中的依赖注入,可以让你从第一原理中轻松地找出这些东西)
问题在于整个成员资格基础结构是“本机”.NET 代码 (System.Web.Security),它不了解 MVC 以及 MVC 使用的 DI 容器。对 Membership.Provider 的静态调用根据配置返回成员资格提供程序,但是,指定的提供程序类型是通过简单的 Activator.CreateInstance 调用实例化的。因此,依赖注入没有机会启动并设置存储库对结果的依赖。如果您使用 Ninject 显式设置返回的实例,它就可以工作,因为您显式为 Ninject 提供了对象来设置依赖项。即使在这种情况下,它也只能使用属性注入,而不能使用构造函数注入,因为实例是由之前的成员资格配置创建的。
总结一下:您无法轻松地将依赖项注入成员资格提供程序,因为它不是从依赖项注入容器解析的。我认为你有两种可能性:
| 归档时间: |
|
| 查看次数: |
3871 次 |
| 最近记录: |