【问题标题】:Add ViewModel to View type mapping for intercepted types为截获的类型添加 ViewModel 到 View 类型映射
【发布时间】:2015-01-16 18:11:33
【问题描述】:

我在 WPF 应用程序中同时使用 Caliburn Micro 和 Ninject。我正在使用Ninject.Extensions.Interception 拦截并记录对我的 ViewModels 的调用,但是这阻止了 Caliburn 定位 ViewModels 的视图,因为 Caliburn 正在处理截获的具有不同命名空间和名称的 viewModel(代理)。

例如,而不是得到:

MyApp.ViewModels.OrdersViewModel

它正在获取:

Castle.Proxies.IOrdersProxy

更复杂的是,ViewModel 和 View 位于不同的程序集中,因此不能假定命名空间。

由于我需要在运行时询问代理,我需要一种以编程方式而不是通过添加字符串映射来挂钩视图解析的方法。我没有看到任何方法可以做到这一点 - Calliburn Micro 可以吗?

【问题讨论】:

    标签: c# caliburn.micro ninject-interception


    【解决方案1】:

    好的,我明白了。我没有与映射作斗争,而是在 WindowManager 中展开代理:

    using System;
    using System.Collections.Generic;
    using Caliburn.Micro;
    using Castle.DynamicProxy;
    
    namespace CAM.Utility
    {
        public class WindowManagerEx : WindowManager, IWindowManagerEx
        {
            private readonly List<object> _trayIcons;
    
            public WindowManagerEx()
            {
                _trayIcons = new List<object>();
            }
    
            public override bool? ShowDialog(object rootModel, object context = null, IDictionary<string, object> settings = null)
            {
                rootModel = rootModel.UnwrapProxy();
    
                return base.ShowDialog(rootModel, context, settings);
            }
    
            public override void ShowWindow(object rootModel, object context = null, IDictionary<string, object> settings = null)
            {
                rootModel = rootModel.UnwrapProxy();
    
                base.ShowWindow(rootModel, context, settings);
            }
    
            public override void ShowPopup(object rootModel, object context = null, IDictionary<string, object> settings = null)
            {
                rootModel = rootModel.UnwrapProxy();
    
                base.ShowPopup(rootModel, context, settings);
            }
    
            public bool? ShowDialog<TViewModel>(object context = null, IDictionary<string, object> settings = null)
            {
                var viewModelInstance = IoC.Get<TViewModel>();
    
                return ShowDialog(viewModelInstance, context, settings);
            }
    
            public void ShowWindow<TViewModel>(object context = null, IDictionary<string, object> settings = null)
            {
                var viewModelInstance = IoC.Get<TViewModel>();
    
                ShowWindow(viewModelInstance, context, settings);
            }
    
            public void ShowPopup<TViewModel>(object context = null, IDictionary<string, object> settings = null)
            {
                var viewModelInstance = IoC.Get<TViewModel>();
    
                ShowPopup(viewModelInstance, context, settings);
            }
    
            public void ShowTrayIcon<TViewModel>(object context = null)
            {
                var viewModelInstance = IoC.Get<TViewModel>();
    
                _trayIcons.Add(viewModelInstance);
            }
    
            public void Dispose()
            {
                foreach (var trayIcon in _trayIcons)
                {
                    var disposable = trayIcon as IDisposable;
                    if (disposable != null)
                    {
                        disposable.Dispose();
                    }
                }
            }
        }
    
        public static class CastleProxyExtensions
        {
            public static object UnwrapProxy(this object target)
            {
                var proxy = target as IProxyTargetAccessor;
    
                if (proxy != null)
                {
                    dynamic dynamicProxy = proxy;
    
                    dynamic interceptors = dynamicProxy.__interceptors;
    
                    dynamic interceptor = interceptors[0];
    
                    target = interceptor.Instance;
                }
    
                return target;
            }
        }
    }
    

    如果您想知道 IWindowManagerEx 是什么:

    public interface IWindowManagerEx : IWindowManager, IDisposable
    {
        bool? ShowDialog<TViewModel>(object context = null, IDictionary<string, object> settings = null);
    
        void ShowWindow<TViewModel>(object context = null, IDictionary<string, object> settings = null);
    
        void ShowPopup<TViewModel>(object context = null, IDictionary<string, object> settings = null);
    
        void ShowTrayIcon<TViewModel>(object context = null);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-09-06
      • 1970-01-01
      • 2021-11-26
      • 2018-05-07
      • 1970-01-01
      • 2018-12-29
      • 2016-04-15
      • 2015-02-24
      • 1970-01-01
      相关资源
      最近更新 更多