У меня есть объект IConfig, содержащий параметры, используемые во всем приложении. В настоящий момент я вставляю весь объект в конструктор каждого объекта, который ему нужен, следующим образом:
public interface IConfig
{
string Username { get; }
string Password { get; }
//... other settings
}
public class Foo : IFoo
{
private readonly string username;
private readonly string password;
public Foo(IConfig config)
{
this.username = config.Username;
this.password = config.Password;
}
}
Недостатком является то, что IConfig содержит большое количество настроек, поскольку он десериализован из общего файла конфигурации, поэтому инъекция всего объекта не требуется. То, что я хотел бы сделать, это изменить конструктор на Foo(string username, string password), чтобы он получал только нужные ему настройки. Это также упрощает создание объектов Foo для тестирования (не нужно настраивать IConfig только для создания Foo). Я хотел бы привязать аргументы конструктора непосредственно в моем NinjectModule, что-то вроде следующего:
public class MyModule : NinjectModule
{
public override void Load()
{
Bind<IConfig>().To<JsonConfig>()
.InSingletonScope();
Bind<IFoo>().To<Foo>()
.WithConstructorArgument("username", IConfig.Username)
.WithConstructorArgument("password", IConfig.Password);
}
}
Очевидно, что этот код не работает, но как я буду делать то, что хотел?
Моя первоначальная идея состояла в том, чтобы использовать NinjectModule.Kernel, чтобы получить IKernel, затем получить экземпляр моего объекта IConfig и вставить свойства по мере необходимости, но объект, возвращаемый NinjectModule.Kernel, не имеет метода Get<T>().