2008-09-03 14 views
21

MicrosoftのManaged Extensibility Framework(MEF)で多くの人が働いていますか?それはすべての人にすべてのことをしようとしているように聞こえる - それはアドインマネージャーです!それはアヒルのタイピングです!私は、誰かがそれを経験しているかどうか、肯定的か否定的か疑問に思います。.NETの管理拡張フレームワークはどちらですか?

私たちは現在、次の大きなプロジェクトに汎用IoC実装ala MvcContribを使用する予定です。ミックスにMEFを投げなければなりませんか?

答えて

33

MEFが万能IoCであることを目指しているわけではありません。 MEFのIoCの側面について考える最善の方法は実装の詳細です。 IoCは、私たちが解決しようとしている問題に対処するための素晴らしい方法であるため、パターンとしてIoCを使用します。

MEFは拡張性に焦点を当てています。 MEFを考えてみると、それを私たちのプラットフォームを前進させるための投資と見なします。将来の製品とプラットフォームは、拡張性を高めるための標準的なメカニズムとしてMEFを活用します。サードパーティの製品やフレームワークも、この同じメカニズムを活用することができます。 MEFの平均「ユーザー」は、MEFが使用するコンポーネントを作成し、アプリケーション内でMEFを直接消費することはありません。

今後、私たちのプラットフォームを拡張したい場合は、dllをbinフォルダにドロップすると完了です。新しい拡張機能でMEF対応のアプリが点灯します。それがMEFのビジョンです。

1

これはコントロール容器の注入ではありません。プラグインのサポートフレームワークです。

1

私は、.NET 4.0 Frameworkの 'System'ネームスペースには間に合わないと間違っています。 MEFがどのように発展し、ハミルトン・ベリシモ(城)がMEFの方向性にどのような影響を与えているのか興味深いでしょう。それがアヒルのように鳴く場合、それだけでIoCコンテナの現在の群れの一部である可能性があります

...

8

この投稿は、2

だから、マネージド拡張フレームワークのプレビューを指し、I MEFを駆け抜けていて、簡単な「Hello World」を書きました。これは以下のとおりです。私はそれがダイビングと理解することは完全に簡単だったと言わなければならない。カタログシステムは素晴らしく、MEF自体を非常に簡単に拡張します。 addinアセンブリのディレクトリにそのオブジェクトを指し、残りの部分を処理させるのは簡単です。 MEFの遺産であるAla Prismは確かに明らかにしていますが、両方のフレームワークが構成に関するものであれば、そうでないと奇妙に思えます。

私のクローに一番スティックがあるのは_container.Compose()の "魔法"だと思います。 HelloMEFクラスを見てみると、挨拶のフィールドは決して面白いと感じるコードのいずれによっても初期化されないことがわかります。私はIoCコンテナが動作する方法を好むと思います。コンテナにオブジェクトを構築するよう明示的に要求します。私は何らかの種類の "Nothing"または "Empty"ジェネリックイニシャライザが順番に並んでいるのだろうかと思います。容器組成コードが実際の「何か」でそれを埋めるために実行されるよう、少なくともそのような時間まで、「何か」のオブジェクトを埋める即ち

private IGreetings greetings = CompositionServices.Empty<IGreetings>(); 

。私は知らない - Visual BasicのEmptyキーワードやNothingキーワードを少し叩き、いつも嫌いだった。他の誰かがこれについていくつかの考えを持っているなら、私はそれらを聞きたいと思います。たぶんそれは私が乗り越える必要があるかもしれません。それは大きな脂肪[インポート]属性でマークされているので、それは完全な謎や何かのようではありません。

オブジェクトライフタイムの制御は明白ではありませんが、エクスポートされたクラスに[CompositionOptions]属性を追加しない限り、デフォルトですべてがシングルトンになります。それでは、FactoryまたはSingletonを指定しましょう。ある時点でこのリストにPooledが追加されているのがうれしいでしょう。

ダックの入力機能がどのように機能するかはっきりしていません。ダックタイピングよりもオブジェクト作成時のメタデータ注入に似ています。そして、あなたは1つの追加のアヒルだけを追加できるように見えます。しかし、私が言ったように、私はこれらの機能がどういう仕組みになっているかについては本当に明確ではない。うまくいけば私は後で戻ってこれを記入することができます。

私は、DirectoryPartCatalogによって読み込まれたDLLをシャドウコピーすることをお勧めします。現在、MEFがそれらを保持すると、DLLはロックされます。これにより、ディレクトリウォッチャーを追加して更新されたアドインをキャッチすることもできます。それはかなり甘いでしょう...

最後に、私はaddin DLLがどのように信頼されているか、MEFが部分的な信頼環境でどのように動作するかについて心配しています。私は、MEFを使用しているアプリケーションが完全な信頼を必要とすると考えています。独自のAppDomainにアドインを読み込むことも賢明かもしれません。私はそれがSystem.AddInのビットを叩くが、それはユーザーアドインとシステムアドイン間の非常に明確な分離を可能にすることを知っている。

大丈夫です。 MEFとC#のHello Worldがあります。楽しい!

using System; 
using System.ComponentModel.Composition; 
using System.Reflection; 

namespace HelloMEF 
{ 
    public interface IGreetings 
    { 
     void Hello(); 
    } 

    [Export(typeof(IGreetings))] 
    public class Greetings : IGreetings 
    { 
     public void Hello() 
     { 
      Console.WriteLine("Hello world!"); 
     } 
    } 

    class HelloMEF : IDisposable 
    { 
     private readonly CompositionContainer _container; 

     [Import(typeof(IGreetings))] 
     private IGreetings greetings = null; 

     public HelloMEF() 
     { 
      var catalog = new AggregateCatalog(); 
      catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); 
      _container = new CompositionContainer(catalog); 
      var batch = new CompositionBatch(); 
      batch.AddPart(this); 
      container.Compose(batch); 

     } 

     public void Run() 
     { 
      greetings.Hello(); 
     } 

     public void Dispose() 
     { 
      _container.Dispose(); 
     } 

     static void Main() 
     { 
      using (var helloMef = new HelloMEF()) 
       helloMef.Run(); 
     } 
    } 
} 
+1

私は最近、MEFプレビュー4でプレイしましたが、彼らコードをいくらか整理しました。 AggregatingComposablePartCatalogはAggregateCatalogなどになりました。大成功を収めたIMHO –

2

アンディは、私はグレン・ブロックは、人々の多くに答えると信じMSDNフォーラムMEF上でこのスレッドアップでこのような(ナチュラル)質問:

Comparison of CompositionContainer with traditional IoC Containers

上記のArtemの答えは、MEFの背後にある主な目的と比べて正しいですが、これは拡張性であり合成ではありません。主に構成に興味がある場合は、他の通常のIoCの容疑者の1人を使用してください。一方で、主に拡張性に関心がある場合は、カタログ、部品、メタデータタグ付け、アヒルタイピング、および遅延ロードの導入により、いくつかの興味深い可能性が生み出されます。また、Krzysztof CwalinaはMEFとSystem.Addinsが互いにどのように関係しているかを説明するにあたり、hereというショットを取っています。

4

MEFが読み込んだ拡張機能のアンディのセキュリティ上の問題(十分な点はまだありません:))では、これに対処する場所はカタログにあります。 MEFカタログは完全にプラガブルなので、ロードする前にアセンブリキーなどを検証するカスタムカタログを作成できます。必要に応じてCASを使用することもできます。おそらくカタログを書くことなくこれを行うためのフックを提供することを考えています。ただし、現在のカタログのソースは自由に入手できます。私は最小限の人が(おそらく私たちのチームで)誰かを実装し、CodePlexの拡張/ contribプロジェクトに投げ込むと思う。

4

現在のドロップではあるが、ダックタイピングはV1には含まれません。将来のドロップでは、ダックタイピング機構でフックできるアダプター機構で置き換えます。ダックタイピングを検討した理由は、バージョニングシナリオに対応するためです。 Duck Typingを使用すると、輸出業者と輸入業者の間の共有参照を削除することができ、複数のバージョンの契約を並行して使用することができます。

関連する問題