2

我使用ASP.NET MVC 5 Unity 3Unity bootstrapper for ASP.NET MVC解決。類型不統一[MVC 5]

在UnityConfig.cs文件,我註冊RegisterTypes方法如下類型:

public static void RegisterTypes(IUnityContainer container) 
{ 
    container.RegisterType<IProjectRepository, ProjectRepository>(); 
} 

在一個MVC控制器,我解決這樣的:

UnityContainer container = new UnityContainer(); 

public ActionResult List() 
{ 
    var projectRepository = container.Resolve<IProjectRepository>(); 

    return View(projectRepository.GetAll()); 
} 

但我正在逐漸以下例外:

System.InvalidOperationException:類型IProjectRepository沒有 可訪問的構造函數。

當我註冊了控制器內部的類型,那麼它的作品完美,所以在某種程度上團結忘記了什麼是在UnityConfig.RegisterTypes()定義。

我把一個破發點中UnityConfig.RegisterTypes()和方法被調用。

+0

ProjectRepository真的有無參數的構造函數嗎?你只有一個名爲'ProjectRepository'的類嗎? – Bond

+0

是的,它有一個無參數的構造函數,是的,只有一個類。如果我在控制器中包含我的Unity DI代碼,那麼它工作正常。 – davenewza

+0

您是否創建了類型爲IProjectRepository的依賴項屬性? –

回答

3

你沒有獲得註冊的依賴,因爲你實際上是創建其中沒有關於註冊類型UnityConfig.RegisterTypes任何信息()新的容器。

可以使用構造器注入

IUnityContainer container; 
public MyController(IUnityContainer _container) 
{ 
    container = _container; 
} 

編輯目前獲得例如統一容器:另外在我看來,更好的去耦最好不要直接使用的容器。您可以使用相同的構造函數注入輕鬆初始化您的存儲庫對象。

IProjectRepository projectRepository; 
public MyController(IProjectRepository _projectRepository) 
{ 
    projectRepository = _projectRepository; 
} 

第二種方法更好,因爲您沒有耦合到任何特定的依賴注入器。將來如果您需要更改依賴注入器,則不需要更改控制器代碼。

+0

第二種方法很有意義。但是,如何將混凝土庫注入控制器? – davenewza

+1

MVC使用當前依賴注入框架自動解析構造函數注入(在你的情況下,Unity)。 –