Je dirais que vous êtes en violation de deux principes: le principe de responsabilité unique (SRP) et de l'open/closed principle (OCP).
Vous êtes à la violation de la SRP en raison de la phase de classe ont plus d'une raison de changer: si vous modifiez le modèle de la liaison ou de l'auto mappeur de configuration.
Vous serait violer l'OCP si vous étiez à ajouter de l'amorçage de code pour la configuration d'un sous-composant du système.
Comment j'ai l'habitude de gérer ce que je définissent l'interface suivante.
public interface IGlobalConfiguration
{
void Configure();
}
Pour chaque composant dans le système d'amorçage je voudrais créer une classe qui implémente cette interface.
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.
}
}
J'utilise Ninject à injecter les dépendances. IConfiguration
est à la base de la mise en œuvre de la statique AutoMapper
de la classe et de l' ModelBinderDictionary
est le ModelBinders.Binder
objet. Je ne puis définir un NinjectModule
qui pourrait balayer l'assembly spécifié pour toute la classe qui implémente l' IGlobalConfiguration
interface et ajouter ces classes à un composite.
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);
}
}
Je voudrais ensuite ajouter le code suivant à la Mondiale.asax fichier.
public class MvcApplication : HttpApplication
{
public void Application_Start()
{
IKernel kernel = new StandardKernel(
new AutoMapperModule(),
new MvcModule(),
new GlobalConfigurationModule()
);
Kernel.Get<IGlobalConfiguration>().Configure();
}
}
Maintenant mon code d'amorçage adhère à la fois SRP et de l'OCP. Je peux facilement ajouter d'autres amorçage code par la création d'une classe qui implémente l' IGlobalConfiguration
interface et ma configuration globale classes seulement ont une raison d'en changer.