Я пытаюсь использовать политику создания разделяемой части для экспорта MEF. Однако, похоже, это не работает так, как я думал. Я делаю композицию дважды в своем приложении и каждый раз получаю свежую копию объекта. Я доказал это, добавив счетчик экземпляров к экземпляру объекта
static int instCount = 0;
public FakeAutocompleteRepository()
{
instCount++;
...
}
и запускать все это в режиме отладки. Действительно, во второй раз, когда я делаю композицию, я получаю новую копию FakeAutocompleteRepository с instCount = 2. Раздел экспорта содержит
[PartCreationPolicy(CreationPolicy.Shared)]
[Export(typeof(IAutocompleteRepository))]
[ExportMetadata("IsTesting", "True")]
class FakeAutocompleteRepository : IAutocompleteRepository
{ ... }
Есть ли хитрость для получения одного и того же экземпляра для повторяющихся запросов? На случай, если я что-то делаю во время композиции, я делаю это
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly()));
catalog.Catalogs.Add(new DirectoryCatalog("."));
var container = new CompositionContainer(catalog);
var batch = new CompositionBatch();
batch.AddPart(this);
container.Compose(batch);
if (null != ConfigurationSettings.AppSettings["IsTesting"] && bool.Parse(ConfigurationSettings.AppSettings["IsTesting"]))
repository = container.GetExports<IAutocompleteRepository>().Where(expDef => expDef.Metadata.Keys.Contains("IsTesting")).Single().GetExportedObject();
В основном я пытаюсь форсировать определенную композицию во время тестирования. Если у вас есть лучшая идея для юнит-тестирования этих композиций, тогда я весь в ушах.