この投稿は、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();
}
}
}
私は最近、MEFプレビュー4でプレイしましたが、彼らコードをいくらか整理しました。 AggregatingComposablePartCatalogはAggregateCatalogなどになりました。大成功を収めたIMHO –