在与Windsor的依赖项中使用相同的参数值

时间:2015-06-24 12:34:26

标签: c# castle-windsor

甚至不确定这可以做到并且可能需要重新考虑整个事情,不过我想在做之前会问。

好的我有一个带有以下构造函数的存储库类

    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一起注册到ServiceService,并在注入参数userRepository时传递该值。

因此,如果另一个服务需要使用与不同数据库相同的存储库,则在注册时会提供新名称。

这可能吗?

1 个答案:

答案 0 :(得分:0)

我无法确切地知道你正在寻找什么,但是使用命名注册可能会让你以更加温莎的方式达到相同的目标 - “正确”。

例如,以下两个注册可以串联:

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")

然后,您可以连接您的服务以依赖Windsor中的特定注册。例如,这个将被绑定到第一次注册:

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

这将绑定到第二个:

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

总的来说,我觉得它提供了一个更清洁的解决方案,因为它处理DI注册中的依赖项配置的所有,而不是留下任何松散的结束以包含在实际服务中,并且允许您根据需要路由依赖项。