2015-06-24 55 views
3

甚至不知道這是可以做到的,可能需要重新考慮整個事情,但是我想在做之前會問。使用相同的參數值與溫莎的依賴關係

好吧,我有一個倉庫類應用程序中的任何位置下面的構造

public Repository(ISessionManager sessionManager, string dbName) 
    { 
     this.sessionManager = sessionManager; 
     this.dbName = dbName; 
    } 

目前需要使用它使用依賴注入和倉庫用,像這樣的容器中註冊庫。

Component.For<IRepository<User, int>>().ImplementedBy<Repository<User, int>>() 
        .DependsOn(Dependency.OnValue("dbName", "admin")), 

我所希望做的是推動數據庫名上升了一個層次,其將使用存儲庫服務的設定。

例如具有與該構造

public SecurityService(ITransactionFactory transactionFactory, 
         IRepository<User, int> userRepository, 
         string dbName) 

我想要的參數DBNAME與針對ServiceService容器註冊,並具有注入參數userRepository當傳遞該值的服務。

因此,如果另一個服務需要將同一個存儲庫與不同的數據庫一起使用,那麼當它被註冊時會提供一個新名稱。

這可能嗎?

+0

[這是一個可能的解決方案](http://stackoverflow.com/a/22690848/1698557)。否則,你可以爲'IRepository'創建一個[工廠](https://github.com/castleproject/Windsor/blob/master/docs/typed-factory-facility-interface-based.md),它將dbName作爲參數並將其注入到'SecurityService'中,然後使用它手動創建存儲庫。 –

回答

0

有沒有辦法,我所知道的,做你正在尋找什麼,但使用命名註冊可以讓你對同一最終目標的方式,是一個有點更Windsor-「正確的」。

例如,下面的兩個註冊可以住在串聯:

Component.For<IRepository<User, int>>() 
     .ImplementedBy<Repository<User, int>>() 
     .DependsOn(Dependency.OnValue("dbName", "admin") 
     .Named("adminRepositoryRegistration") 

Component.For<IRepository<User, int>>() 
     .ImplementedBy<Repository<User, int>>() 
     .DependsOn(Dependency.OnValue("dbName", "user") 
     .Named("userRepositoryRegistration") 

然後,你可以線了您的服務依賴於溫莎的特別登記。舉例來說,這個人會被綁定在第一個報名:

Component.For<IUserService>() 
     .ImplementedBy<UserService>() 
     .DependsOn(Dependency.OnComponent("userRepository", "userRepositoryRegistration") 

,這將綁定到第二:

Component.For<ISecurityService>() 
     .ImplementedBy<SecurityService>() 
     .DependsOn(Dependency.OnComponent("adminRepository", "adminRepositoryRegistration") 

總的來說,我覺得它給出瞭解決方案的一點清潔劑,因爲它在DI註冊中處理所有依賴關係配置,而不是留下任何鬆散的結束在實際服務中結束,並允許您根據需要路由依賴關係。

+0

。是我走到最後的方式,似乎只有這樣做的方法。可能再也不需要這樣做了 –