2

Net 4.5.1 と StructureMap 3.1.4 の使用

抽象クラスを拡張するサービスがあります:

 public abstract class Charting<T> {

   protected readonly String baseConfigurationString;

   public Charting(String baseConfigurationString)
   {
      this.baseConfigurationString = baseConfigurationString;
   }

   ...
 }

具体的なサービスごとに、 baseConfigurationStringを設定したいと思います。現在、サービスごとに個別に行っています。

 public class MyRegistry : Registry
 {
    public MyRegistry()
    {
        Profile("Development", x => {
            ForConcreteType<AveragePartySizeChart>().Configure.Ctor<String>("baseConfigurationString").Is(MyDbConfiguration.getBaseConnectionString());

            ...next service....about 6 total
        });
    }
 }

ジェネリック修飾子があるにもかかわらず、一般的に抽象クラスに対してこれを行う方法はありますか?

4

2 に答える 2

1

これは、プロファイルの問題を介した抽象コンストラクター引数の設定を解決しませんが、プリミティブ型への依存関係を避けSystem.String、代わりに抽象化を使用することをお勧めします。

IDatabaseSettings環境変数またはアプリケーション設定のいずれかに必要な接続設定を取得するタイプを使用できます。

public interface IDatabaseSettings
{
  string DbConnectionString { get; set; }
}

public class DatabaseSettings : IDatabaseSettings
{
  public string DbConnectionString { get; set; }
}

public class DatabaseRegistry : Registry
{
  public DatabaseRegistry()
  {
    For<IDatabaseSettings>().Use(c =>
    {
        var setting = c.GetInstance<DatabaseSettings>();

        setting.DbConnectionString =
            System.Configuration.ConfigurationManager.AppSettings["DatabaseSettings.DBConnectionString"];

        return setting;
    });
  }
}

重要:プロジェクトは System.Configuration を参照する必要があります。

設定が多い場合は、このパターンを慣例化することをお勧めします。これを簡単にするために、 FubuCoreSettingsProviderのアウトを使用します。アプリケーション設定からプロパティが自動的に入力される Settings で終わるオブジェクトがあるだけです。Chad Myers は、それに関する素敵なブログ記事を書いています。

于 2014-10-13T14:25:38.340 に答える