Как я понимаю, чтобы атрибуты импорта / экспорта были правильно связаны друг с другом, мне нужно вызывать compositionContainerInstance.Compose(...)
с каждым новым экземпляром, который имеет эти атрибуты.
Возможно ли иметь этопроисходит автоматически, поэтому мне не нужно делать это всякий раз, когда я создаю новый экземпляр некоторого компонуемого класса?
Это будет пример, хотя в целом он абстрагирует мою проблему.
public class Worker1
{
[Import(typeof(IDataProvider))]
public IDataProvider DataProvider;
public Worker2 second;
//use data provider to perform logic
}
public class Worker2
{
[Import(typeof(IDataProvider))]
public IDataProvider DataProvider;
//use data provider to perform logic
}
[Export(typeof(IDataProvider))]
public class GeoDataProvider : IDataProvider
{
//implements logic
}
public class Container
{
private Worker1 t1;
public void Init()
{
AggregateCatalog cat = new AggregateCatalog();
cat.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
cat.Catalogs.Add(new DirectoryCatalog("."));
CompositionContainer c = new CompositionContainer(cat);
c.ComposeParts(new GeoDataProvider(), this);
}
public void PerformLogic()
{
t1 = new Worker1;
//here it fails because I need c.ComposeParts(t1):
t1.DoSomethingWithProvider();
//but even if I do c.ComposeParts(t1), still the t1.second.DataProvider will be null
//how to avoid this?
}
}
То, на что я надеюсь, это способ свободно создавать новые экземпляры Worker1 / Worker2 без необходимости знать, что они должны быть составлены перед использованием.Это возможно?