2010-11-11 40 views
2

我是Ninject的新手,試圖弄清楚實現。我正在搜索和閱讀,任何人都可以向我指出一些特定於Ninject和MVC的良好示例和文檔。Ninject 101 for MVC

我可以得到的基本工作,我掙扎着有依賴關係的綁定。例如,我有以下類:

public class ScheduleService : IScheduleService 
    { 
     private IValidationDictionary validationDictionary; 
     public ScheduleService(IValidationDictionary validationDictionary) 
     { 
      this.validationDictionary = validationDictionary; 
     } 
    } 

這取決於:

public class ModelStateWrapper : IValidationDictionary 
    { 
     private ModelStateDictionary _modelState; 

     public ModelStateWrapper(ModelStateDictionary modelState) 
     { 
      _modelState = modelState; 
     } 

,我想創建綁定:

Bind<IValidationDictionary>() 
        .To<ModelStateWrapper>(); 

       Bind<IScheduleService>() 
        .To<ScheduleService>(); 

如何建立映射,所以我控制器可以使用ScheduleService?它如何獲得ModelState?

澄清: 我想將其注入處理業務邏輯的調度服務類。我有Ninject工作,只是不知道如何處理依賴關係。以下是我的控制器代碼。

public class ScheduleController : ActivityController 
{ 
    private IScheduleService scheduleService; 


    public ScheduleController(IScheduleService scheduleService) 
    { 
     this.scheduleService = new ScheduleService(new ModelStateWrapper(this.ModelState)); 
    } 

感謝您的耐心,我可能不會問正確的問題。它建立,但是當我運行它時,我得到:

錯誤激活IValidationDictionary 沒有匹配的綁定可用,並且類型不可自行綁定。 激活路徑:依賴IValidationDictionary的 3)注射到參數validationDictionary類型ScheduleService的構造的 2)依賴性IScheduleService注射入型ScheduleController的構造 1)請求的參數scheduleService爲ScheduleController

建議: 1)確保您已經爲IValidationDictionary定義了一個綁定。 2)如果綁定是在模塊中定義的,請確保該模塊已加載到內核中。 3)確保你不小心創建多個內核。 4)如果您正在使用自動模塊加載,請確保搜索路徑和過濾器是正確的。

+0

我可能會重新考慮這一方案。 ModelState是特定動作的上下文,因此不能在全局級別注入。 – 2010-11-11 13:27:37

+0

這也可能是相關的:http://stackoverflow.com/questions/4127184/ninject-error-he-icontrollerfactory-ninject-web-mvc-ninjectcontrollerfactory-d/4127715#4127715 – 2010-11-11 13:46:55

回答

1

一件事是注入工廠生產的IValidationDictionary。例如,你的控制器構造將採取IValidationFactory,並IValidationFactory有一個方法:GetValidation(ModelStateDictionary的ModelState)和您的默認實現返回你的ModelStateWrapper。這允許你完整的IoC,你可以注入你自己的存根用於單元測試。

如果只有一個或IValidationDictionary兩種方法,你也可以只通過的ModelState到被調用的方法,而不是試圖把它注入到構造函數。

+0

你能表現出這方面的一些代碼。我無法想象這樣做(你的第一部分沒有通過方法傳遞) – chobo2 2011-01-23 21:52:44

+0

在重新閱讀原始問題並思考它之後,我認爲我的回答是不正確的或無效的。他要求將IScheduleService注入ModelStateWrapper,而不是控制器。因爲控制器具有創建時間表服務沒有控制,沒有辦法得到它的ModelState。如果我必須在應用程序中執行此操作,我會將ModelStateWrapper作爲IValidationDictionary參數傳遞給在IScheduleService上調用的方法。 – 2011-01-24 15:56:25

+0

你能詳細說明你的最後一行嗎? – chobo2 2011-01-30 18:06:12

3

你的意思是沿着線的東西:

設置Ninject2

public class MvcApplication : NinjectHttpApplication 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     //Here goes routing setup 
    } 

    protected override void OnApplicationStarted() 
    { 
     RegisterRoutes(RouteTable.Routes); 
     RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
    } 

    protected override IKernel CreateKernel() 
    { 
     return new StandardKernel(new ServiceModule()); 
    } 
} 

internal class ServiceModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IValidationDictionary>().To<ModelStateWrapper>(); 
     Bind<IScheduleService>().To<ScheduleService>(); 
    } 
} 

注入控制器

public class HomeController : Controller 
{ 
    private readonly IValidationDictionary _validationDictionary; 
    private readonly IScheduleService _scheduleService; 

    public HomeController(IValidationDictionary validationDictionary, IScheduleService scheduleService) 
    { 
     _validationDictionary = validationDictionary; 
     _scheduleService = scheduleService; 
    } 
} 
1

你不能真正做到這一點。模型狀態是由控制器在初始化時設置的。我不知道Ninject,但是你應該能夠對你的服務做一個上下文的解析並把它傳遞給當前的模型狀態。這不是一個很好的解決方案,我不會推薦它。

基本上你的問題在於Ninject不知道如何解決ModelStateDictionary,因爲你還沒有告訴它如何。如果你對modelstatewrapper類的依賴關係是不是上下文的其他東西,那麼你只需要在Ninject中設置它就可以使它工作。你可能會考慮