2015-09-08 61 views
4

我剛開始使用統一的容器和我的註冊看起來像這樣:團結集裝箱解決

static void UnityRegister() 
{ 
     _container = new UnityContainer(); 
     _container.RegisterType<IBook, Book>(); 
     _container.RegisterType<IBookRepository, BookRepository>("Book"); 
     _container.RegisterType<IBookService, BookService>(); 
     _container.RegisterType<IBookRepository, DatabaseRepository>("Database"); 
} 

現在,當我嘗試解決這樣做:

var service = _container.Resolve<IBookService>("Database"); 

我得到以下錯誤:

解析依賴失敗,type =「UnityConsoleEx.IBookService」,name =「Database」。 發生異常時:解析時。 異常是:InvalidOperationException - 當前類型UnityConsoleEx.IBookService是一個接口,無法構建。你是否缺少類型映射?

At the time of the exception, the container was: 

Resolving UnityConsoleEx.IBookService,Database 

任何人都可以點什麼,我做錯了什麼?

回答

6

主要問題是您沒有爲您的BookService使用命名實例。

_container.RegisterType<IBookService, BookService>(); 

但是您正在嘗試使用命名實例進行解析。

var service = _container.Resolve<IBookService>("Database"); 

您需要解析沒有名稱才能獲得該實例。

var service = _container.Resolve<IBookService>(); 

但是從您的示例中不清楚您爲什麼首先使用命名實例。如果您發佈服務的構造函數,將更清楚如何使您的配置工作。

0

我想,你試着解決BookService與應包含DatabaseRepository作爲參數。你不能這樣做。

你可以這樣說:

var service = _container.Resolve<IBookService>(new ParameterOverride("repository", _container.Resolve<IBookRepository>("Database"))); 

也許,更好的辦法是註冊庫一次,conditionaly:

_container = new UnityContainer(); 
    _container.RegisterType<IBook, Book>(); 
    if (useDatabase) 
    { 
     _container.RegisterType<IBookRepository, DatabaseRepository>(); 
    } 
    else 
    { 
     _container.RegisterType<IBookRepository, BookRepository>(); 
    } 
    _container.RegisterType<IBookService, BookService>(); 

而現在,解析服務。 另外,你可以配置你的容器是這樣的:

_container.RegisterType<IBookService, BookService>(
    new InjectionConstructor(      // Explicitly specify a constructor 
     new ResolvedParameter<IBookRepository>("Database") // Resolve parameter of type IBookRepository using name "Database" 
    ) 
); 

這將告訴容器使用構造單IBookRepository參數來解決IBookService,並與Database名稱解析IBookRepository

2

我想通了,我需要這些服務創建命名實例,並注入構造,因此:

static void UnityRegister() 
{ 
    _container = new UnityContainer(); 
    _container.RegisterType<IBook, Book>(); 
    _container.RegisterType<IBookRepository, BookRepository>();    
    _container.RegisterType<IBookRepository, DatabaseRepository>(); 

    _container.RegisterType<IBookService, BookService>("BookService", new InjectionConstructor(typeof(BookRepository))); 
    _container.RegisterType<IBookService, BookService>("DatabaseService", new InjectionConstructor(typeof(DatabaseRepository))); 
} 

而如下解決這個問題:

var service = _container.Resolve<IBookService>("DatabaseService");