単一責任の原則 (SRP) とオープン/クローズの原則 (OCP) という 2 つの原則に違反していると私は主張します。
ブートストラップ クラスには複数の変更理由があるため、SRP に違反しています: モデル バインディングまたは自動マッパー構成を変更した場合。
システムの別のサブコンポーネントを構成するためのブートストラップ コードを追加すると、OCP に違反することになります。
これを通常どのように処理するかは、次のインターフェイスを定義することです。
public interface IGlobalConfiguration
{
void Configure();
}
ブートストラップが必要なシステム内のコンポーネントごとに、そのインターフェイスを実装するクラスを作成します。
public class AutoMapperGlobalConfiguration : IGlobalConfiguration
{
private readonly IConfiguration configuration;
public AutoMapperGlobalConfiguration(IConfiguration configuration)
{
this.configuration = configuration;
}
public void Configure()
{
// Add AutoMapper configuration here.
}
}
public class ModelBindersGlobalConfiguration : IGlobalConfiguration
{
private readonly ModelBinderDictionary binders;
public ModelBindersGlobalConfiguration(ModelBinderDictionary binders)
{
this.binders = binders;
}
public void Configure()
{
// Add model binding configuration here.
}
}
Ninject を使用して依存関係を注入します。は静的クラスIConfiguration
の基になる実装であり、オブジェクトです。次に、指定されたアセンブリをスキャンしてインターフェイスを実装するクラスを探し、それらのクラスをコンポジットに追加する を定義します。AutoMapper
ModelBinderDictionary
ModelBinders.Binder
NinjectModule
IGlobalConfiguration
public class GlobalConfigurationModule : NinjectModule
{
private readonly Assembly assembly;
public GlobalConfigurationModule()
: this(Assembly.GetExecutingAssembly()) { }
public GlobalConfigurationModule(Assembly assembly)
{
this.assembly = assembly;
}
public override void Load()
{
GlobalConfigurationComposite composite =
new GlobalConfigurationComposite();
IEnumerable<Type> types =
assembly.GetExportedTypes().GetTypeOf<IGlobalConfiguration>()
.SkipAnyTypeOf<IComposite<IGlobalConfiguration>>();
foreach (var type in types)
{
IGlobalConfiguration configuration =
(IGlobalConfiguration)Kernel.Get(type);
composite.Add(configuration);
}
Bind<IGlobalConfiguration>().ToConstant(composite);
}
}
次に、次のコードを Global.asax ファイルに追加します。
public class MvcApplication : HttpApplication
{
public void Application_Start()
{
IKernel kernel = new StandardKernel(
new AutoMapperModule(),
new MvcModule(),
new GlobalConfigurationModule()
);
Kernel.Get<IGlobalConfiguration>().Configure();
}
}
現在、私のブートストラップ コードは SRP と OCP の両方に準拠しています。インターフェイスを実装するクラスを作成することで、追加のブートストラップ コードを簡単に追加できIGlobalConfiguration
ます。グローバル構成クラスを変更する理由は 1 つだけです。