我正在寻找一个我怀疑是一个相当基本的问题的答案。
我现在开始使用Windsor,并且正在努力弄清楚如何注册接口......
在我的应用程序中,我有一个IRepository接口,它在构造函数中传递给我的控制器。我希望温莎为我解决这些依赖关系,但我正在努力弄清楚如何做到这一点。
所以我的IRepository看起来有点像这样:
public interface IRepository : IDisposable
{
List<string> GetList();
}
这是在两个类中实现的:
public class Repository1 : IRepository
{
public List<string> GetList(){...}
}
public class Repository2 : IRepository
{
public List<string> GetList(){...}
}
我的控制器看起来有点像这样:
public class HomeController : Controller
{
private readonly IRepository _repo;
public HomeController(IRepository repo)
{
_repo = repo;
}
...
现在我想注册IRepository以解析Repository1或Repository2的任何一个实现(最终我希望能够找出哪个Repository在其他程序集中可用并加载哪个可用)
现在,我已经注册了类并更改了构造函数以获取其中一个类的实例,但是我想对接口进行操作......那就是我在努力的地方。
我还希望这是足够通用的,如果我有一个IWhatever和一个实现它的类,那么windsor也能够解决这个问题,而不需要注册每一个......
我有这个(哪个有效)
container.Register(Classes.FromAssemblyContaining<Repository1>()
.BasedOn(typeof(IRepository))
.WithService.AllInterfaces()
.LifestyleTransient());
但它只注册了Repository1 ......任何帮助都表示赞赏,同时我会再次阅读文档,看看它是否会在这个时候下沉!
由于
答案 0 :(得分:0)
我认为发生的情况是您注册了两个存储库,但由于您的控制器只要求一个存储库,Windsor默认返回the first one。
您可以做些什么来检查存储库是否在注册后调用container.ResolveAll();我认为你会得到两个结果。
要解决此问题,您必须告诉控制器它必须解析存储库列表(即IRepository []),或者您必须缩小预期的存储库类型。例如,如果您的控制器是Controller<T>
并且您的存储库是IRepository,则会根据T
的类型进行选择。
答案 1 :(得分:0)
找到答案: http://mikehadlow.blogspot.co.uk/2010/01/10-advanced-windsor-tricks-2-auto.html?m=1
这正是我所寻找的,感谢大家的帮助!