我正在尝试使用 MVC 3 中的 ninject 将存储库注入(inject)自定义成员资格提供程序。
在 MembershipProvider 我尝试了以下方法:
[Inject]
public ICustomerRepository _customerRepository{ get; set; }
和
[Inject]
public TUMembershipProvider(ICustomerRepository customerRepository)
{
_customerRepository = customerRepository;
}
在我的 ninject 模块中,我尝试了以下操作:
Bind<MembershipProvider>().ToConstant(Membership.Provider);
以上都不起作用。
当我使用(在 global.asa 中)
kernel.Inject(Membership.Provider);
和...一起
[Inject]
public ICustomerRepository _customerRepository{ get; set; }
它可以工作,但我没有生命周期管理,这将导致 NHibernate 出现“ISession 已打开”错误,因为 ISession 是 InRequestScope 而存储库不是。
最佳答案
您可以使用 @Remo Gloor outlines in his blog post on provider injection 的方法.它涉及3个步骤:
[Inject]
s 到您需要注入(inject)的提供程序上的任何属性(尽管他展示的模式 - 创建一个非常简单的类,其唯一功能是接受属性注入(inject)并将任何请求转发到使用构造函数注入(inject)实现的真实类 - 很好值得关注)public class MyMembershipProvider : SqlMembershipProvider
{
[Inject]
public SpecialUserProvider SpecialUserProvider { get;set;}
...
IHttpModule
的初始化程序包装器它将提供者拉进来,触发它的创建:-public class ProviderInitializationHttpModule : IHttpModule
{
public ProviderInitializationHttpModule(MembershipProvider membershipProvider)
{
}
...
IHttpModule
在您的 RegisterServices
:-kernel.Bind<IHttpModule>().To<ProviderInitializationHttpModule>();
IHttpModules
包括您添加的那个)在启动序列期间。 (不要忘记阅读博客文章重新生命周期等的评论。)
最后,如果您正在寻找可以巧妙解决问题的完全无脑直接的方法,请尝试 this @Remo Gloor answer instead
PS 一篇关于整个困惑的精彩文章是 Provider is not a Pattern by @Mark Seemann . (以及他的优秀著作的必修插件:- Dependency injection in .NET 这将使您从第一原理中轻松地弄清楚这些东西)
关于asp.net-mvc - 使用 Ninject 将存储库注入(inject)自定义成员提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5596441/