2011-02-24 72 views
3

我想通过类型绑定到对象instanced。C#MEF不能做类型绑定?

什么我现在要做的:

var catalog = new AssemblyCatalog(typeof(...).Assembly); 

var container = new CompositionContainer(catalog); 
    var batch = new CompositionBatch(); 
var mySamurai = new Samurai(); 
batch.AddPart(mySamurai);//I would prefer the type not an object...  
    container.Compose(batch); 
mySamurai.Attack(); 

这是工作,但我想这样做:

var catalog = new AssemblyCatalog(typeof(...).Assembly); 
var container = new CompositionContainer(catalog); 
var batch = new CompositionBatch(); 

batch.AddPart(typeof(Samurai));//HERE container.Compose(batch);   
var mySamurai = new Samurai(); 
mySamurai.Attack(); 

那是可能的MEF?

回答

1

通常情况下,您可以在MEF中设置导出和导入属性,而不是像Ninject那样在代码中进行配置。

即使MEF不在框中执行“代码中的配置”,仍然可以使用MEFContrib项目对factory export provider执行此操作。

更新:在MEF2-Preview3中添加了attribute-less registration

此外,Mark Seemann blogged关于通过巧妙使用属性导出和泛型,即使不使用新的无属性注册来“注册”类型的方法。

1

如果我正确地理解你,没有办法做到这一点。 MEF在看到虚假实体2时无法做任何事情,因为MEF从未真正“看到”它。你必须像使用fakeEntity一样将它传递给容器,或者你必须导出FakeEntity类,并以某种方式从容器中取出它(例如使用GetExportedValue)。

+0

我想让MEF绑定一种FakeEntityInheritEntity来为它注入一种类型。 – 2011-02-24 20:28:16

+0

我改变了我的问题,以便更准确。 – 2011-02-24 20:49:35

+0

@Daok你不能那样做。 MEF无法知道您创建的对象完全独立于它。您可以将一个'ExportAttribute'添加到'Samurai'并调用'container.GetExportedValue ()'。 – 2011-02-24 21:15:54

0

我对MEF了解不多,但是你的情况看起来像是Ninject,Unity,StuctureMap,Castle Windsor等等的IoC容器。