这份原稿.使用Castle.Windsor从IoC容器中解析视图模型

本文关键字:模型 视图 IoC 使用 Windsor Castle | 更新日期: 2023-09-27 18:04:21

我用的是Caliburn。Micro要构建一个复合UI应用,并决定使用Castle Windsor来构建ViewModel对象,这样他们需要操作的任何服务都可以自动注入,避免servicelocator反模式。

问题是Castle Windsor使用属性注入将我的视图模型对象的ActiveItem属性设置为(似乎是它发现的第一个与IScreen服务匹配的组件),因为它解决了它们。

我不想让它这样做,因为我想通过调用ActivateItem()来设置活动屏幕,当我已经确定了我想要渲染视图的视图模型。

它看起来不像温莎城堡可以做执行属性注入(我使用流畅注册API与IWindsorInstaller类),所以什么是一个很好的方法来这里?

我应该从容器解析ViewModel对象吗?如果没有,那么避免服务定位器反模式的好方法是什么?

提前感谢。

这份原稿.使用Castle.Windsor从IoC容器中解析视图模型

似乎暂时起作用的是:

_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"属性来查找依赖项。

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

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