В настоящее время я реализую API настройки IoC для внутреннего использования (в значительной степени вдохновленный модульной системой Autofac
).
У нас есть Module
s, которые настраиваются через строго типизированную конфигурацию, иЯ хочу, чтобы модуль мог требовать других модулей, поэтому у меня может быть основной модуль, похожий на «составной корень», который будет загружать все приложение целиком.
public interface IModule<TConfig>
{
TConfig Config { get; }
void Load(ContainerBuilder builder);
void LoadExtraModules(ModuleRegister register);
}
Я сейчас занимаюсь проектированиемModuleRegister
класс.То, что я хочу сделать, похоже на это:
public class MyModule : ModuleBase<ApplicationConfiguration>
{
public void LoadExtraModules(ModuleRegister register)
{
register.Module<SqlModule>().WithConfig(new SqlConfiguration() { ... });
}
}
public class SqlModule : ModuleBase<SqlConfiguration>
{
public void Load(ContainerBuilder builder)
{
// configuration code.
}
}
Мне бы хотелось, чтобы Intellisense как-то подсказал, что SqlConfiguration
- это правильный тип конфигурации для SqlModule
, но яне могу этого сделать: я хотел бы выразить параметр типа, похожий на
// ... inside an helper ExtraModulesRegister<TModule> class
public void WithConfig<TConfig>(TConfig configuration)
where TModule : IModule<TConfig>
{
...
}
, но, очевидно, я могу выражать ограничения только для TConfig, а не для TModule.
Единственное решение, которое я нашел, этоиспользовать метод расширения, подобный следующему:
public static void WithConfig<TConfig, TModule>(this ExtraModulesRegister<TModule> register,
TConfig configuration)
where TModule : IModule<TConfig>, new()
{
register.LoadModule<TModule, TConfig>(configuration);
}
, чтобы я мог выразить два ограничения типа, одно из которых на уже определенный универсальный параметр TModule
.
Я могу (почти)свободно менять дизайн всего.
Любое предложение приветствуется.