Caliburn.Micro - 使用Castle.Windsor从IoC容器中解析ViewModel

时间:2011-08-02 14:04:51

标签: c# castle-windsor caliburn.micro

我正在使用Caliburn.Micro构建一个复合UI应用程序,并决定使用Castle Windsor构建ViewModel对象,以便他们需要操作的任何服务都可以自动注入并避免使用servicelocator反模式。 / p>

问题在于Castle Windsor正在使用属性注入来设置我的viewmodel对象的ActiveItem属性(看起来它找到的第一个与IScreen服务匹配的组件),因为它解析了它们。 / p>

我不希望它这样做,因为我想在我找出想要渲染视图的视图模型时调用ActivateItem()来自己设置活动屏幕。

看起来Castle Windsor看起来不像执行属性注入(我正在使用带有IWindsorInstaller类的流畅注册API),那么什么是好方法带到这儿?

是否应该从容器中解析ViewModel对象?如果不是,那么避免服务器反模式的好方法是什么?

非常感谢提前。

2 个答案:

答案 0 :(得分:3)

似乎暂时有效,如下:

_container.Kernel.ComponentModelCreated += model =>
{
    IEnumerable<PropertySet> nonInjectableProperties = model.Properties
        .Where(set => set.Property.Name == "ActiveItem").ToList();

    foreach (PropertySet nonInjectableProperty in nonInjectableProperties)
    {
        model.Properties.Remove(nonInjectableProperty);
    }
}

本质上,这是拦截组件的解析并从中删除其中一个属性,这样当解析组件时,内核不再看到“ActiveItem”属性来查找依赖项。

答案 1 :(得分:1)

要在整个容器中关闭属性注入,请尝试以下操作:

container.Kernel.ComponentModelBuilder.RemoveContributor(container.Kernel.ComponentModelBuilder.Contributors.OfType<PropertiesDependenciesModelInspector>().Single());