2015-01-16 10 views
0

WPF 앱에서 Caliburn Micro와 Ninject를 함께 사용하고 있습니다. Ninject.Extensions.Interception을 사용하여 내 ViewModels에 대한 호출을 가로 채고 기록하지만 Caliburn은 다른 네임 스페이스 및 이름 인 차단 된 viewModel (프록시)이 전달되므로 Caliburn이 ViewModels에 대한보기를 찾지 못합니다. 대신지고의 예를 들어ViewModel을 추가하여 가로 채기 유형에 대한 유형 매핑보기

:

MyApp.ViewModels.OrdersViewModel 

가 점점 :

Castle.Proxies.IOrdersProxy 

은 더욱, ViewModels 및 뷰가 다른 어셈블리에있는 일을 복잡하게하기 때문에 네임 스페이스는 가정 할 수 없습니다.

런타임에 프록시를 조사해야하므로 문자열 매핑을 추가하는 대신 프로그래밍 방식으로보기 해상도에 연결하는 방법이 필요합니다. 이 작업을 수행 할 방법이 없습니다. Calliburn Micro에서 가능합니까?

답변

1

좋습니다. 알겠습니다. 대신 매핑을 싸우고, 나는 대신 창 관리자의 프록시를 풀기 오전 :

이 경우 또한
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); 
}