2010-11-08 63 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