我试图在MVC 3中使用ninject注入一个自定义成员资格提供商。
在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个步骤:
>将[注入]添加到您需要注入的提供商上的任何属性(尽管他显示的模式 – 创建一个非常简单的类,其唯一的功能是容纳属性注入,并将任何请求转发到使用构造函数实现的实际类中注射 – 值得关注)
public class MyMembershipProvider : sqlMembershipProvider { [Inject] public SpecialUserProvider SpecialUserProvider { get;set;} ...
>创建一个初始化程序包装器,它实现IHttpModule,它提供提供者,触发它的创建:
public class ProviderInitializationHttpModule : IHttpModule { public ProviderInitializationHttpModule(MembershipProvider membershipProvider) { } ...
kernel.Bind<IHttpModule>().To<ProviderInitializationHttpModule>();
>没有4;在启动过程中,Ninject执行其他操作 – 引导所有注册的IHttpModules,包括您添加的一个。
最后,如果你正在寻找一个完全可以彻底解决这个问题的东西,请试试this @Remo Gloor answer instead
在整个混乱中,PS是一个伟大的写作是Provider is not a Pattern by @Mark Seemann.(和他的优秀的书籍 – Dependency injection in .NET,这将使你从第一原则舒适地弄清楚这个东西的oboligently插头)