2016-06-23 44 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