2010-11-08 62 views
11

我是Ninject的新手,我在使用它与自定义成员资格提供程序时遇到问题。使用Ninject with Membership.Provider

我的会员供应商在通过的仓库界面看起来像:

public class CustomMembershipProvider : MembershipProvider 
{ 
    public CustomMembershipProvider(IRepository repository) 
    { 
    } 
} 

我正在使用的代码多数民众赞成在MVC应用程序为起点的账户模型的一部分。

但是,当它调用Membership.Provider时出现错误,说No parameterless constructor defined for this object

我已经在ninject中设置绑定,将IRepository绑定到一个Repository类,它的工作原理是我在控制器中测试了这个。

Ninject中用于Membership.Provider的正确绑定是什么?

+0

请查看答案和奖励最好的一个,如果你能 – mare 2015-01-15 12:51:20

回答

9

这是怎么回事,今日毕既MVC和Ninject的新版本(版本3):

您可以访问DependencyResolver实例,Ninject将自身作为当前DependencyResolver。这样你就不需要黑客来访问静态Ninject内核。请注意,我的例子使用我自己的IUserService存储库成员...

IUserService _userService = DependencyResolver.Current.GetService<IUserService>(); 
+0

中调用“Inject”方法。您如何在WebForms而不是MVC中执行此操作? – Tom 2012-08-14 05:25:09

+0

这是比直接ninject内核使用更好的解决方案。 – kaptan 2012-11-21 19:21:08

+0

非常感谢! – 2015-01-14 11:15:38

0

我还没有使用过Ninject。 但StructureMap我设置这种依赖性:

expression.For<MembershipProvider>().Add(System.Web.Security.Membership.Provider); 

,它工作正常。

+2

这不回答这个问题。他问的是如何创建提供者实例,而不是如何将提供者注入其他东西。 – 2010-11-08 13:48:20

5

由于成员集合和Membership.Provider实例是在Ninject可以实例化它们之前创建的,因此您需要在该对象上执行创建后激活。如果您在提供者类中为您的属性标记了您的依赖关系[Inject],则可以拨打kernel.Inject(Membership.Provider) - 这会将所有依赖关系指定给您的属性。

+0

回想一下,它会在提供程序上创建一个Ninject依赖项。不是一个大问题,但如果你的提供者是一个图书馆的一部分,意味着尽可能少的外部依赖,那么它就没有趣味。 – crush 2014-11-20 21:16:12

9

我发现最好的解决办法是如下:

private IRepository _repository; 

[Inject] 
public IRepository Repository 
{ 
    get { return _repository; } 
    set { _repository= value; } 
} 

public CustomMembershipProvider() 
{ 
    NinjectHelper.Kernel.Inject(this); 
} 

凡NinjectHelper是一个静态辅助类从获得籽粒。

+4

什么是NinjectHelper?我找不到它。我是否需要自己创建它? – Tomas 2012-04-13 08:50:05

+0

+1使用该属性,但不适用于使用“助手”。你在这里做的服务定位器反模式(有点)。您可以在WebActivator.PostApplicationStartMethod – 2012-10-12 06:42:27