2016-06-23 43 views
0

所以我想要做的是一样的东西......注册命名的服务在性能

[Name("MY_CLASS")] 
public class MyClass : IMyInterace {...} 

也许

public class MyClass : IMyInterace { 
    string Name => "MY_CLASS"; // part of interface 
} 

,然后东西autofac像...

builder.RegisterAssemblyTypes(asm) 
    .Where(...) // lazy typing that properly 
    .Named<IMyInterface>(x => x.Name); 

是否有这样的可能?

PS:我知道,我可以只注册这些实现的命名服务,但有两个缺点:

  1. 许多条目,还有一两件事,当你添加到忘记新的东西
  2. 名称和类是在不同的地方,而不是漂亮的一个地方
+2

目前尚不清楚您想要实现什么......您为什么需要使用这些动态密钥注册您的组件?但是你可以查看元数据支持:http://docs.autofac.org/en/latest/advanced/metadata.html – nemesv

+0

@nemesv:基本上我们从API获得这些魔术键,然后切换行为。目前它就像'switch(key)case“MY_CLASS”[code]'。所以很显然,用'IIndex 替换'并且摆脱大约50个条件是很好的... – FrankyBoy

+0

简短答案是肯定的!我会建议对第一个..因为类继承应该是使他们不纯正的因素 – Seabizkit

回答

0

也许你应该考虑这个的其他方式,编写代码来发现你有可用的类(反射?),当你的条件满足,运行builder.RegisterTy pe

+0

我也可以只是明白注册它们,注入一个IEnumerable ,然后通过它们。由于所有的事情都是SingleInstance(这是它自己的一个痛点,但我现在没有改变),所以这不算是额外的努力。 – FrankyBoy