2012-02-25 63 views
0

編輯

我很困惑的特定部分是錯誤。ModelStateDictionary循環依賴注入循環錯誤

5)依賴ModelStateDictionary注射入型的構造ModelStateDictionary

ModelStateDictionary具有接受一個ModelStateDictionary對象的構造的參數字典。這是爲什麼/哪裏出現錯誤?如果是這樣,我該如何解決它,因爲ModelStateDictionary不是我可以直接修改的n個對象。

原始

我一直試圖讓依賴注入設置爲我控制器在一個asp.net MVC應用程序上工作。但是我最終得到了System.Web.Mvc.ModelStateDictionary的循環依賴。我做了一些搜索... herehere和別人,我已經嘗試了一些像創建一個屬性的建議(也許我只是不知道在哪裏放置它們),而不是將其通過構造函數。然而,在我看來,ninject是有與System.Web.Mvc.ModelStateDictionary類或定義一個問題。我得到以下錯誤...

Activation path: 
5) Injection of dependency ModelStateDictionary into parameter dictionary of constructor of type ModelStateDictionary 
4) Injection of dependency ModelStateDictionary into parameter modelState of constructor of type ModelStateWrapper 
3) Injection of dependency IValidationDictionary into parameter validationDictionary of constructor of type ProjectService 
2) Injection of dependency IProjectService into parameter prjService of constructor of type ProjectController 
1) Request for ProjectController 

我的類幾乎定義如下。我明明已經刪除了一些多餘的東西...

public class ProjectController : Controller 
{ 
    private IProjectService _prjService; 
    private IMembershipService _membershipService; 

    public ProjectController(IProjectService prjService,IMembershipService membershipService) 
    { 
     _membershipService = membershipService; 
     _prjService = prjService; 
    } 

} 


public class ProjectService : ServiceBase, IProjectService 
{ 
    public ProjectService(IValidationDictionary validationDictionary) : base(validationDictionary) { } 
} 


public class ServiceBase 
{ 
    private readonly IValidationDictionary _validationDictionary; 

    public IValidationDictionary ValidationDictionary { get { return _validationDictionary; } } 

    public ServiceBase(IValidationDictionary validationDictionary) 
    { 
     _validationDictionary = validationDictionary; 
    } 

} 


public interface IProjectService 
{ 
    // interface has other properties 

    IValidationDictionary ValidationDictionary { get; } 
} 

public class ModelStateWrapper : IValidationDictionary 
{ 
    private ModelStateDictionary _modelState; 

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

    public ModelStateWrapper() 
    { 

    } 

    public void AddError(string key, string errorMessage) 
    { 
     _modelState.AddModelError(key, errorMessage); 
    } 

    public bool IsValid 
    { 
     get { return _modelState.IsValid; } 
    } 
} 

ModelStateDictionary的定義如下......至少據我認爲它涉及到這個問題。是

[Serializable] 
public class ModelStateDictionary : IDictionary<string, ModelState>, ICollection<KeyValuePair<string, ModelState>>, IEnumerable<KeyValuePair<string, ModelState>>, IEnumerable 
{ 
    public ModelStateDictionary(); 

    public ModelStateDictionary(ModelStateDictionary dictionary); 
} 

我已經設置了ninject的綁定如下...

 kernel.Bind<IMembershipService>().To<AuthMembershipService>(); 
     kernel.Bind<IProjectService>().To<ProjectService>(); 
     kernel.Bind<IValidationDictionary>().To<ModelStateWrapper>(); 

請讓我知道如果我能提供任何更多信息...我最初嘗試使用structuremap但無法讓DI工作...我似乎至少有ninject設置和工作的大部分。

感謝,

+0

向我們展示了'ModelStateWrapper'的代碼。 – Steven 2012-02-25 09:02:57

+0

道歉Steven,我想我已經加入了它。我現在添加了它。 – 2012-02-25 19:33:48

回答

1

Ninject選擇與它知道如何在默認情況下,創造最參數的構造。在這種情況下,第二個構造函數被選中。這將導致一個堆棧溢出,因爲它將不得不創建一個ModelStateWrapper注入到ModelStateWrapper中,而另一個注入到第二個中,......

除非第二個構造函數有一個很好的理由,應該簡單地刪除它。否則,你必須在這裏給出足夠的信息,我們可以理解爲什麼有第二個構造函數。

+0

聖雷莫的ninject文件說,下面...當記者問到實例化一個對象,Ninject會看類型的可用的公共構造函數,並挑選一個與它知道如何解決最參數 - **或參數的一個,如果有沒有任何合適的人。**。那麼,我的預期是一直在使用的構造最參數,所以它應該已經回落到使用參數的構造函數ninject不能創建對象。對?我錯過了什麼? – 2012-02-25 19:40:15

+0

ModelStateDictionary隱式綁定到它自己。所以Ninject知道如何解決它。 – 2012-02-25 23:49:05

+0

對......應該應該不會吧......但是他們爲什麼它不能在這一步......5)將依賴性ModelStateDictionary注入到ModelStateDictionary類型的構造函數的參數字典中...還有第二個構造函數? modelStateWrapper構造函數接受ModelStateDictionary而不是ModelStateWrapper ... – 2012-02-26 05:45:24