从温莎城堡自动解决

时间:2012-12-22 18:23:43

标签: c# mvvm dependency-injection inversion-of-control castle-windsor

我试图在不同的程序集中分离我的Model,View和ViewModel,并使用Castle Windsor实例化它们。

我有我的app.config

<components>
  <component id="ViewModel.SomeViewModel" service="TEST.Business.IViewModel, TEST.Business" type="TEST.ViewModel.SomeViewModel, Test.ViewModel" />
  <component id="ViewModel.SomeView" service="TEST.Business.IView, TEST.Business" type="TEST.View.SomeView, Test.View" />
</components>

并通过

解决
IoC.Configure(); 
var viewModel = IoC.Resolve<IViewModel>();
var view = IoC.Resolve<IView>();
view.ShowDialog();

我的静态IoC类

public static class IoC
{
    private static IWindsorContainer container;

    public static void Configure()
    {

        IResource resource = new ConfigResource("castle");
        container = new WindsorContainer(new XmlInterpreter(resource));
    }

    public static TService Resolve<TService>()
    {
        return container.Resolve<TService>();
    }
}

直到现在还很简单。

但我很乐意这样做:

命名必须是这样的:我[someName] ViewModel和我[someName]查看 然后解析我的app.config中的每个组件,从而为每对View和ViewModel解析并关联它们。

我想我的问题有很多解决方案,但我不知道要使用哪些关键字。

顺便说一句:我[someName] ViewModel和View都是IViewModels和IViews

3 个答案:

答案 0 :(得分:0)

使用反射迭代要解析的程序集中的类型。您可以使用Classes进行注册。

var assembly = Assembly.GetExecutingAssembly(); // Replace with the assembly you want to resolve for.
var exports = assembly.ExportedTypes;
var viewTypes = exports.Where(t => t.GetInterface(typeof(IView).FullName) != null);

foreach (var viewType in viewTypes)
{
    var viewModelType = assembly.GetType(viewType.FullName.Replace("View", "ViewModel"));
    var viewModel = container.Resolve(viewModelType);
    var view = container.Resolve(viewType);
    view.ShowDialog();
}

在您的示例中,我看不到IViewModel和IView之间的任何依赖关系,因此您的代码没有意义。如果视图模型作为构造函数的参数注入,它将自动解析。

我不建议这样做。它可能比它需要的更复杂。您确定您真的了解如何使用IoC容器/ Castle Windsor吗?

答案 1 :(得分:0)

我认为你做错了。

不要抽象视图和查看模型。它没有给你带来任何好处。因此问题是建筑问题,而不是技术问题。

答案 2 :(得分:0)

一旦你习惯了Ioc容器就很棒了。通常,您只想使用应用程序的主/引导代码中的容器。对我来说,似乎你试图让容器静态的解析函数允许在任何地方解析组件。这不应该是必需的。

如果您正在寻找一种方法来以很好的方式绑定视图和查看模型,请查看caliburn micro。您可以将它与大多数Ioc容器结合使用,包括windsor

亲切的问候,

Marwijn。