【问题标题】:Caliburn.Micro - resolving ViewModels from IoC container using Castle.WindsorCaliburn.Micro - 使用 Castle.Windsor 从 IoC 容器解析 ViewModel
【发布时间】:2011-08-02 14:04:50
【问题描述】:

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

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

我不希望它这样做,因为我想通过调用ActivateItem() 自己设置活动屏幕,当我确定要为哪个视图模型渲染视图时。

看起来不能让温莎城堡执行属性注入(我正在使用带有IWindsorInstaller 类的流畅注册API),那么有什么好的方法可以采取在这里?

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

非常感谢。

【问题讨论】:

    标签: c# castle-windsor caliburn.micro


    【解决方案1】:

    似乎暂时起作用的是:

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

    【讨论】:

      【解决方案2】:

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

      container.Kernel.ComponentModelBuilder.RemoveContributor(container.Kernel.ComponentModelBuilder.Contributors.OfType&lt;PropertiesDependenciesModelInspector&gt;().Single());

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-26
        • 2014-08-07
        • 2013-08-26
        • 1970-01-01
        • 2016-10-01
        • 2012-06-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多