2015-06-24 29 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

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