在与 Windsor 的依赖项中使用相同的参数值
Using same parameter value in a dependency with Windsor
甚至不确定这是否可以完成,可能需要重新考虑整个事情,但我想在这样做之前我会问一下。
好的,我有一个存储库 class,其中包含以下构造函数
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 时传递该值。
因此,如果另一个服务需要使用具有不同数据库的相同存储库,那么在注册时会提供一个新名称。
这可能吗?
据我所知,我无法完全按照您的要求进行操作,但使用命名注册可能会让您以更温莎的方式达到相同的最终目标-"correct".
例如,以下两个注册可以同时存在:
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 注册中的 所有 依赖项配置,而不是留下任何未解决的问题实际服务,并允许您根据需要路由依赖项。
甚至不确定这是否可以完成,可能需要重新考虑整个事情,但我想在这样做之前我会问一下。
好的,我有一个存储库 class,其中包含以下构造函数
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 时传递该值。
因此,如果另一个服务需要使用具有不同数据库的相同存储库,那么在注册时会提供一个新名称。
这可能吗?
据我所知,我无法完全按照您的要求进行操作,但使用命名注册可能会让您以更温莎的方式达到相同的最终目标-"correct".
例如,以下两个注册可以同时存在:
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 注册中的 所有 依赖项配置,而不是留下任何未解决的问题实际服务,并允许您根据需要路由依赖项。