我正在使用Caliburn.Micro构建一个复合UI应用程序,并决定使用Castle Windsor构建ViewModel对象,以便他们需要操作的任何服务都可以自动注入并避免使用servicelocator反模式。 / p>
问题在于Castle Windsor正在使用属性注入来设置我的viewmodel对象的ActiveItem
属性(看起来它找到的第一个与IScreen
服务匹配的组件),因为它解析了它们。 / p>
我不希望它这样做,因为我想在我找出想要渲染视图的视图模型时调用ActivateItem()
来自己设置活动屏幕。
看起来Castle Windsor看起来不像不执行属性注入(我正在使用带有IWindsorInstaller
类的流畅注册API),那么什么是好方法带到这儿?
我不是否应该从容器中解析ViewModel对象?如果不是,那么避免服务器反模式的好方法是什么?
非常感谢提前。
答案 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());