GÜNCELLEŞTIRME: DI kapsayıcısıyla işlemeye çalışmalı mıyım yoksa yanlış bir soyutlama seviyesi mi olmalıyım?MEF ve FABRİKA FABRİKASI
ABSTRACT FACTORY uygulamasını MEF (.NET 4.5) kullanarak uygulamak istiyorum.
Benim için çalışmıyor ...
kompozisyon değişmeden kalır. Değişiklikler aşağıdaki hatalar nedeniyle reddedildi:
Kompozisyon, tek bir kompozisyon hatası oluşturdu. Kök neden aşağıda verilmiştir. Daha ayrıntılı bilgi için CompositionException.Errors özelliğini gözden geçirin.
ContractName Mef3.Factory sonuçlanan
RequiredTypeIdentity Mef3.Factory :
1) Hayır ihracat kısıtlamasını eşleşen bulundu ithalat 'Mef3.Program._factory (ContractName = "Mef3 ayarlanamaz. "Mef3.Program" bölümündeki fabrika ").
Element: Mef3.Program._factory (ContractName = "Mef3.Factory") -> Mef3.Program
o MEF bunu yapmak için doğru yolu var mı? Kimlik numarasını Foo/Bar ctors'a nasıl iletebilirim?
kodu:
class Program
{
static void Main(string[] args)
{
var program = new Program();
program.Run();
}
readonly CompositionContainer _container;
public Program()
{
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
_container = new CompositionContainer(catalog);
_container.ComposeParts(this);
}
[Import]
public Factory _factory;
public void Run()
{
var foo = _factory.GetInstance("foo", 123);
Console.WriteLine(foo is Foo);
}
}
[Export]
public class Factory
{
private readonly ExportFactory<Foo> _fooFactory;
private readonly ExportFactory<Bar> _barFactory;
[ImportingConstructor]
public Factory(ExportFactory<Foo> fooFactory, ExportFactory<Bar> barFactory)
{
_fooFactory = fooFactory;
_barFactory = barFactory;
}
public Base GetInstance(string name, int id)
{
switch (name)
{
case "foo":
return _fooFactory.CreateExport().Value;
case "bar":
return _barFactory.CreateExport().Value;
}
throw new ArgumentException();
}
}
public class Foo : Base
{
[ImportingConstructor]
public Foo([Import("Id")] int id)
{
}
}
public class Bar : Base
{
[ImportingConstructor]
public Bar([Import("Id")] int id)
{
}
}
[InheritedExport]
public abstract class Base
{
}
Teşekkür ederiz. Foo/Bar ctor parametrelerini kaldırdım. Aynı istisnayı atar. –
İsteğe bağlı olmadığı için kimlik için özellik enjeksiyonu kullanmak garip görünüyor. Böyle bir senaryonun DI desene uygun olmadığını düşünüyor musunuz? MEF sadece sorun mu? Diğer DI kapsayıcısını mı kullanmalıyım yoksa DI için yanlış bir soyutlama seviyesi mi? –
Bu kod pasajını deneyen var mı? Ben istisna atar tek kişi ben miyim? –