温莎城堡注册类型

时间:2014-03-15 12:41:07

标签: c# interface castle-windsor

我正在寻找一个我怀疑是一个相当基本的问题的答案。

我现在开始使用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 ......任何帮助都表示赞赏,同时我会再次阅读文档,看看它是否会在这个时候下沉!

由于

2 个答案:

答案 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

这正是我所寻找的,感谢大家的帮助!