起動時にIoC(Windsor v3.0)を使用して、インターフェイス/サービスを実装する場合はディレクトリ内のすべてのアセンブリをアプリケーションのコア用のリポジトリにロードするプログラムを作成しています。私は、しかし、ウィンザーの新人です。私のアプリはDBテーブルをポーリングし、処理が必要な行が見つかると、サービスの名前をチェックしてレコードを処理し、リポジトリから要求します。 this postのように、すべてのモジュールを辞書にロードし、次にリポジトリにロードすることができます。良いと、よく、私はそれはより動的にする必要があります。データ駆動型IoC
私は(擬似コード)、それを想像する方法:
List<string> enabledServices = GetServicesFromDb();
IDictionary<string, IModule> dict = new IDictionary<string, IModule>();
//Load the assemblies (This works currently!)
_container.Register(AllTypes
.FromAssemblyInDirectory(new AssemblyFilter("Modules"))
.BasedOn<IModule>());
// Build dictionary
foreach(string service in enabledServices)
{
foreach(?? asmble in _container.assemblies)
{
if(asmble.Id == service)
dict.Add(service, asmble);
}
}
// Register the repository from constructed dictionary
_container.Register(
Component
.For<IModuleRepository>()
.ImplementedBy<IntegrationRepository>()
.Parameters(new { modules = dict})
);
リポジトリ:
public class IntegrationRepository : IModuleRepository
{
private readonly IDictionary<string, IModule> _modules;
public IntegrationRepository(IDictionary<string, IModule> modules)
{
_modules = modules;
}
public IModule GetModule(string moduleName)
{
return _modules.ContainsKey(moduleName) ? _modules[moduleName] : null;
}
}
はIModuleは次のようになります。
public interface IModule : IDisposable
{
string Id { get; }
string Description { get; }
bool Enabled { get; set; }
bool Validate();
string EmailSubject { get; }
}
すべてのモジュール:
- 私は、コンテナを介して、またはその場合は反復処理する方法を知っているウィンザーでの十分な経験を持っていない
「モジュール」サブフォルダ
私の考えは、オブジェクトが既に作成されている場合にオブジェクトを渡すことを暗示するthis exampleから来ています。 And thisは類似しています。 DictionaryAdapterFactory()でも面白いことがいくつかありましたが、使い方が分かりません。
このようなことはありますか?何か案は?代わりに、このすべての
hmmm ... simplistic – sighlent
なぜ複雑になるのですか? :) – maxlego