列挙できるリストに定数があると仮定すると...
IEnumerable<string> constants
……できない理由があるの?
foreach(var constant in constants)
{
// Careful of the closure...
var loopItem = constant;
builder
.Register(c =>
new ClassProcess(
loopItem,
c.ResolveNamed<IClass1>(loopItem),
c.ResolveNamed<IClass2>(loopItem)))
.Named<ClassProcess>(loopItem)
.SingleInstance();
}
私が間違っていたり誤解していたりしない限り、あなたを妨げているのは、識別子定数のセットがまだリストにない場合だけです。これは Autofac がお手伝いできることではありません。
コード内で foreach を使用したくない場合は、いつでもモジュール内で非表示にすることができます。
public class ProcessModule : Autofac.Module
{
private IEnumerable<string> _constants;
public ProcessModule(IEnumerable<string> constants)
{
this._constants = constants;
}
protected override void Load(ContainerBuilder builder)
{
// Put the foreach here and loop over this._constants.
}
}
次に、モジュールをメイン コードに登録します。
builder.RegisterModule(new ProcessModule(constants));
そのようにループできない場合は、自動化のアプローチが制限されている可能性があります。または、少なくとも、もっと複雑なものを見ていることになります。
では、登録されているアイテムのContainerBuilder
セットに直接アクセスすることは実際には許可されていないため、もう少し低レベルのトリックを実行する必要があります。おそらくIRegistrationSource
、特定のタイプのすべての名前付き登録を見つけて自動化するために を実装できます。
残念ながら、前述のように、このプロセスはもう少し複雑なので、ソリューション全体を書き出すつもりはありません。ただし、基本的に何が機能すると思われるかを説明し、ソースコードで例を確認するための参照をいくつか示します。
この道を歩み始める前に、Nick Blumhardt が彼のブログに素晴らしい記事を掲載しており、これらの 1 つを作成する方法を説明し、組み込みの Autofac ソースの 1 つを例として使用しています。
まず、 を実装するAutofac.Core.IRegistrationSource
必要があります。これは、暗黙的なコレクション サポートの追加などを行うために使用されるインターフェイスです (したがって、5 つのIFoo
インスタンスを登録すると解決できIEnumerable<IFoo>
、機能します)。コア Autofac アセンブリの Autofac コードで登録ソースの例を確認できます。
登録ソースの主な機能は、ソースRegistrationsFor
によって生成された登録のリストを返すメソッドです。
IEnumerable<IComponentRegistration> RegistrationsFor(
Service service,
Func<Service, IEnumerable<IComponentRegistration>> registrationAccessor);
このメソッドの実装は、着信service
が...
- An
Autofac.Core.KeyedService
(すべてのサービスに名前を付けているため) AND
- あなたが期待するタイプの。
すべての惑星が整列している場合は、すべての設定が記入されたIComponentRegistration
for を返します。ClassProcess
名前付きの2つの入力パラメーターが必要であり、すべてのパラメーターの依存関係も登録されていることを確認しない限りClassProcess
、おそらく名前付きを登録したくないため、これはより困難になります。ClassProcess
見たサービスを追跡し、ClassProcess
入ってくるすべての依存関係を確認した場合にのみ登録します (入ってKeyedService
くるサービスを使用して、サービスの名前が何であるかを把握できます)。
さらに、そのコンポーネントの登録を作成する作業はContainerBuilder
もう行わないため、「有効期間」などに対応する登録の適切な設定をすべて把握する必要があります。
入手したら、IRegistrationSource
それを に接続する必要がありますContainerBuilder
。
builder.RegisterSource(new MyRegistrationSource());
繰り返しますが、これを追求することに興味がある場合は、Autofac ツリーでこれらのソース ファイルを調べてください。複雑なため、多くの人がたどる道ではありません。
正直なところ...定数をループできるなら、私はそうします。これは、foreach ループを回避するためだけに、多くの作業を行うように思えます。