0

Autofac を使用してコンテキスト駆動型パラメーターを解決するためのより良い方法を見つけようとしています。次のコードを検討してください。

        builder.RegisterType<SqlDatabaseResourceFactory>().WithParameter("connectionStringKey", "MyConnectionStringKey").As<DatabaseResourceFactory>();

        builder.RegisterType<ATypeRepository>().As<IATypeRepository>().PropertiesAutowired();
        builder.RegisterType<BTypeRepository>().As<IBTypeRepository>().PropertiesAutowired();
        builder.RegisterType<CTypeRepository>().As<ICTypeRepository>().PropertiesAutowired();
        builder.RegisterType<DTypeRepository>().As<IDTypeRepository>().PropertiesAutowired();

この場合、各「リポジトリ」には、DatabaseResourceFactory と型指定された ResourceFactory というプロパティがあり、これにはローカルの既定値があります (レガシー コードとの互換性のため)。ResourceFactory を注入する必要があるすべての型が同じ接続文字列を使用している限り、これはうまく機能します。

ただし、たとえば、C および D リポジトリに別の接続文字列が必要な場合、このソリューションは機能しなくなります。私が考えることができる最善の回避策は、次のようなものを使用することです

       builder.RegisterType<ATypeRepository>()
              .As<IATypeRepository>()
              .OnActivating(c => c.Instance.ResourceFactory = new SqlDatabaseResourceFactory("MyConnectionStringKey"));

しかし、これは現在、登録されているリポジトリ タイプごとに行う必要があり、これは過度に反復的で扱いにくいように思われます。この種の問題に対するより良い解決策はありますか。この問題は、根本的なアーキテクチャの問題を示していますか?

4

2 に答える 2

0

あなたが使用することができます:

 builder.Register(c => new CTypeRepository(new SqlDatabaseResourceFactory("C-connectionstring")).As<ICTypeRepository>().PropertiesAutowired();
于 2013-05-08T20:20:39.570 に答える