0

我试图在不同的程序集中分离我的模型、视图和视图模型,并用温莎城堡实例化它们。

我有我的 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>();
    }
}

直到现在真的很简单。

但我很想这样做:

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

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

顺便说一句:I[someName]ViewModel 和 View 是 ofc IViewModels 和 IViews

4

3 回答 3

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 吗?

于 2012-12-23T01:05:06.110 回答
0

我认为你做错了。

不要抽象您的视图和视图模型。它没有给你任何好处。因此,问题是架构问题,而不是技术问题。

于 2012-12-24T07:02:38.843 回答
0

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

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

亲切的问候,

马尔维恩。

于 2013-01-01T18:39:41.563 回答