私の解決策です。最初は、拡張メソッドの作成を試みました。私はいくつかのことを試み、文書を読んで、利用可能なプロパティ、イベント、メソッドをコンテナやカタログで調べましたが、何もできませんでした。
問題を考えた後、私が解決策を考え出すには、CompositionContainerに基づいた派生コンテナを作成し、GetButDoNotCreateメソッドを実装するしかありません。
更新:私は、ソリューションが単純な例でのみ動作し、GetExportedValueを使用して部品の単純な部品を検索することができます。 [Import]を持つ部品が作成されていない場合、[Import]がない部品のための単純なサービスロケータとしてコンテナを使用しない限り、それは、これまでで構成されているタイプを追跡するためにGetExportedValueメソッドをオーバーライドして、GetButNotCreateでの型の組成物を確認するためにこれを使用して動作
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition.Hosting;
using System.ComponentModel.Composition.Primitives;
namespace GetButNotCreate
{
public class CustomContainer : CompositionContainer
{
private List<Type> composedTypes = new List<Type>();
public CustomContainer(ComposablePartCatalog catalog)
: base(catalog)
{
}
public new T GetExportedValue<T>()
{
if (!composedTypes.Contains(typeof(T)))
composedTypes.Add(typeof(T));
return base.GetExportedValue<T>();
}
public T GetButDoNotCreate<T>()
{
if (composedTypes.Contains(typeof(T)))
{
return base.GetExportedValue<T>();
}
throw new Exception("Type has not been composed yet.");
}
}
}
:ここ
は実装です。私はあなたの質問に言及したような例外を投げた。
もちろん、GetExportedValueのオーバーロードをオーバーライドする必要があります(使用しない限り、安全のためにオーバーライドします)。クラスを使用する場合は、他のコンストラクタやものを追加することもできます。この例では、それを動作させるために最小限の努力をしました。
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
namespace GetButNotCreate
{
public interface IInterface { }
[Export(typeof(IInterface))]
public class MyClass : IInterface
{
}
[TestClass]
public class UnitTest1
{
[TestMethod]
[ExpectedException(typeof(Exception), "Type has not been composed yet.")]
public void GetButNotCreate_will_throw_exception_if_type_not_composed_yet()
{
var catalog = new AssemblyCatalog(typeof(UnitTest1).Assembly);
CustomContainer container = new CustomContainer(catalog);
container.ComposeParts(this);
var test = container.GetButDoNotCreate<IInterface>();
}
[TestMethod]
public void GetButNotCreate_will_return_type_if_it_as_been_composed()
{
var catalog = new AssemblyCatalog(typeof(UnitTest1).Assembly);
CustomContainer container = new CustomContainer(catalog);
container.ComposeParts(this);
var x = container.GetExportedValue<IInterface>();
var y = container.GetButDoNotCreate<IInterface>();
Assert.IsNotNull(y);
Assert.AreEqual(x, y);
}
}
}
それはタイプがエクスポートされていない場合GetButNotCreateが例外をスローすることを示しており、それが既にされている場合、それはこのタイプを返すこと:ここでは
は、新しいメソッドをテストするユニットテストです輸入された。
MEFが部品を構成しているかどうかを確認するために、どこにでもフックを見つけることができませんでしたので、このCustomContainerソリューションが私のベスト・ベットになります。
あなたは単体テストで容器をテストしているように見えますか? –
@MatthewAbbott - ViewModelレイヤー(ViewModelの最初のデザインで構築)でシステムテストを書こうとしています。これらは単体テストではありません... UI要素を操作する代わりに、コンテナに手を入れて、ビューモデルをつかんで同じ効果を得たいと思っています。 – Gishu
ここをクリックしてください。http://caliburnmicro.codeplex.com/discussions/348548 – Gishu