城堡温莎登记

时间:2010-05-13 20:59:46

标签: dependency-injection inversion-of-control castle-windsor

interface IUserService
class LocalUserService : IUserService
class RemoteUserService : IUserService

interface IUserRepository
class UserRepository : IUserRepository

如果我有以下接口和类,IUserService类依赖于IUserRepository。我可以通过以下方式注册这些组件:

container.AddComponent("LocalUserService", typeof(IUserService), typeof(LocalUserService));
container.AddComponent("RemoteUserService", typeof(IUserService), typeof(RemoteUserService));
container.AddComponent("UserRepository", typeof(IUserRepository), typeof(UserRepository));

...通过调用获得我想要的服务:

IUserService userService = container.Resolve<IUserService>("RemoteUserService");

但是,如果我有以下接口和类:

interface IUserService
class UserService : IUserService

interface IUserRepository
class WebUserRepository : IUserRepository
class LocalUserRepository : IUserRepository
class DBUserRepository : IUserRepository

如何注册这些组件,以便IUserService组件可以“选择”在运行时注入哪个存储库?我的想法是允许用户通过提供3个单选按钮(或其他)来选择要查询的存储库,并要求容器每次解析一个新的IUserService

1 个答案:

答案 0 :(得分:4)

如果您想决定要注入哪个组件(推送),请使用IHandlerSelector s。

如果您想决定要使用哪个组件,请使用TypedFactoryFacility。

并作为旁注。

请勿使用AddComponent,请使用container.Register(Component.For...)