2008-11-05 1 views
1

MEF 사용 다음을 원합니다.분기가 요청 될 때 Import 트리를 생성하는 MEF

나는 WPF 셸이 있습니다. 쉘에 또 다른 DLL에서 내 MVP 트라이어드 뷰인 UserControl을 가져 오려고합니다. MVP 트라이어드 작동 방식은 발표자에서 IModel과 IView를 모두 가져 와서 전선을 연결하는 생성자가 있다는 것입니다. 그래서,이 작업을 수행하려면 위해, 나는 다음을 수행 MEF가 필요합니다

  1. 작성 개의 IView 구현
  2. 가 발표자를 만들고 생성자
  3. 가져 오기에 IModel 해당과 개의 IView을 통과 IModel 해당 구현 만들기 표시 될 때 내 셸에 IView 구현

대신에 IView 내보내기 유형 만 생성하고 기본적으로 skipp로 전달합니다. 2 단계와 3 단계를 거친다. 당신이 그것에 대해 생각할 때 꽤 논리적이지만, IView를 요청할 때 MEF가 어떻게 전체 트라이어드를 만들 수 있다고 말할 수 있을까? 필자는 Sheller .dll의 다른 곳에서 Presenter 나 모델을 참조 할 필요가 없으므로 Import로도 넣을 수 있습니다. 옵션이 아닙니다. 어쨌든 꽤 추할 것입니다.

MEF (Preview 2 Refresh)의 최신 드롭을 사용하고 있습니다. 누구?

== 업데이트 ==는

나는 해결책을 발견하고 난 여기에 대해 블로그 :
Krzysztof Koźmic's blog - Creating tree of dependencies with MEF

그러나, 나는 더 이상 드릴 것입니다 누군가가 더 나은 함께 온 경우 솔루션 ** **

+0

[ImportingConstructor]를 생성자에 넣었습니까? –

+0

예, 제공 한 링크를 확인했습니다. 코드의 단순화 된 버전과 해결책이 있습니다. 그것은 작동하지만 더 나은 방법이 있는지 궁금하네요. –

답변

2

내 대답을 확인하십시오.

http://codebetter.com/blogs/glenn.block/archive/2008/11/12/mvp-with-mef.aspx

편집 :

1: using System.ComponentModel.Composition; 
    2: using System.Reflection; 
    3: using Microsoft.VisualStudio.TestTools.UnitTesting; 
    4: 
    5: namespace MVPwithMEF 
    6: { 
    7:  /// <summary> 
    8:  /// Summary description for MVPTriadFixture 
    9:  /// </summary> 
    10:  [TestClass] 
    11:  public class MVPTriadFixture 
    12:  { 
    13:   [TestMethod] 
    14:   public void MVPTriadShouldBeProperlyBuilt() 
    15:   { 
    16:    var catalog = new AttributedAssemblyPartCatalog(Assembly.GetExecutingAssembly()); 
    17:    var container = new CompositionContainer(catalog.CreateResolver()); 
    18:    var shell = container.GetExportedObject<Shell>(); 
    19:    Assert.IsNotNull(shell); 
    20:    Assert.IsNotNull(shell.Presenter); 
    21:    Assert.IsNotNull(shell.Presenter.View); 
    22:    Assert.IsNotNull(shell.Presenter.Model); 
    23:   } 
    24:  } 
    25: 
    26:  [Export] 
    27:  public class Shell 
    28:  { 
    29:   private IPresenter _presenter = null; 
    30:   
    31:   public IPresenter Presenter 
    32:   { 
    33:    get { return _presenter; } 
    34:   } 
    35: 
    36:   [ImportingConstructor] 
    37:   public Shell(IPresenter presenter) 
    38:   { 
    39:    _presenter = presenter; 
    40:   } 
    41:  } 
    42: 
    43:  public interface IModel 
    44:  { 
    45:  } 
    46: 
    47:  [Export(typeof(IModel))] 
    48:  public class Model : IModel 
    49:  { 
    50:   
    51:  } 
    52: 
    53:  public interface IView 
    54:  { 
    55:  } 
    56: 
    57:  [Export(typeof(IView))] 
    58:  public class View : IView 
    59:  { 
    60:  } 
    61: 
    62:  public interface IPresenter 
    63:  { 
    64:   IView View { get;} 
    65:   IModel Model { get; } 
    66:  } 
    67: 
    68:  [Export(typeof(IPresenter))] 
    69:  public class Presenter : IPresenter 
    70:  { 
    71: 
    72:   private IView _view; 
    73:   private IModel _model; 
    74: 
    75:   [ImportingConstructor] 
    76:   public Presenter(IView view, IModel model) 
    77:   { 
    78:    _view = view; 
    79:    _model = model; 
    80:   } 
    81: 
    82:   public IView View 
    83:   { 
    84:    get { return _view; } 
    85:   } 
    86: 
    87:   public IModel Model 
    88:   { 
    89:    get { return _model; } 
    90:   } 
    91: 
    92:  } 
    93: } 

는 그래서 여기에 무슨 (품질이 낮은/LOA 것으로 표시되지 않도록하려면 링크에서 추가)?

셸이 발표자와 함께 주입됩니다. 발표자는보기 및 모델로 주입됩니다. 여기에있는 모든 것은 싱글 톤이지만 그렇지 않아도됩니다.

두 가지 예제의 차이점은 발표자가보기가 아닌 셸에 주입된다는 것입니다. 발표자가보기를 만들면 먼저보기를 잡을 수 없으며 발표자가 생성되지 않습니다. 글쎄, 할 수는있어.하지만 그걸 해킹 해 버릴거야. Cleaner는 Presenter를 삽입하고 IView를 노출하도록합니다. 우리는 프리즘 (Prism)에서 이것을 수행했으며 아주 잘 작동했습니다.

+0

(+1) 이것은 질문에 대답하는 것처럼 보입니다. 대답은 단순한 링크 일 뿐이므로 저비용 게시물로 간주됩니다. 링크 외에도 문제의 설명이나 요약과 링크에서 제공되는 솔루션이 순서대로 맞춰져 있다면 훨씬 더 좋습니다. 내가 여기에 메모를 남길 거라 생각했다. * 저품질로 표시되었다. – Arun

+0

링크가 끊어진 경우 어떻게해야합니까? –

1

블로그 게시물에서 설명한 방법은 MEF 활용을위한 완벽한 방법입니다. 이는 중첩 된 컴포지션이며 컨테이너를 결정하는 사람이라면 항상 컨테이너를 결정할 수 있으므로 플러그인/확장 공급 업체는 "내보내는"서비스에 중점을 두어야하며 중요한 것은 다음과 같습니다. 서비스를받을 필요가있는 것에 대해 걱정하지 마십시오. 또는 "가져 오기"(이 지점에는 마지막 문제가 있지만이 점에 대해 낙관적이라고 들었습니다).

따라서 중첩 된 구성에서는 외부 서비스가 필요할 수도 있지만 그 때 일부 서비스를 제공 할 수도 있습니다. 작성을하면 모든 것을 하나로 연결합니다.

내가 생각하는 이런 식으로 설명이 개 예제가 포함 된 블로그 게시물이 있습니다

또한

http://www.sidarok.com/web/blog/content/2008/09/26/what-is-this-managed-extensibility-framework-thing-all-about.html

이, DLL을 드롭하고 그것에 유형을 볼을 해당 폴더를 볼 DirectoryPartCatalog를 사용할 수 있습니다.

또한 동일한 계약에 대해 여러 개의 수출이있는 시나리오를주의 깊게 살펴보고 제공되는 메타 데이터에서 올바른 것을 결정해야합니다.

관련 문제