这份原稿.使用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对象吗?如果没有,那么避免服务定位器反模式的好方法是什么?
提前感谢。
似乎暂时起作用的是:
_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());