Вы можете изменить поведение внедрения путем привязки, используя фабричный метод (т. Е. ToMethod
), и можно разрешить введение нулей, настроив параметр контейнера AllowNullInjection
.
Другой альтернативой может быть использование фабричного метода и предоставление легкого фиктивного объекта вместо вашего тяжелого класса. Если вы используете интерфейсы, это было бы просто, просто есть реализации интерфейса, которые ничего не делают. Вы могли бы даже использовать фальшивый фреймворк, такой как FakeItEasy, для создания этих манекенов для вас. Преимущество в том, что манекен делает специальное поведение прозрачным для клиентов, т. Е. Клиентам не нужно проверять null
и т. Д.
Пример использования фабричного метода, плюс AllowNullInjection
и нули:
public void Configure()
{
bool create = true;
IKernel kernel = new StandardKernel();
kernel.Settings.AllowNullInjection = true;
kernel.Bind<IFoo>().ToMethod(ctx => create ? ctx.Kernel.Get<Foo>() : null);
DependendsOnIFoo depFoo = kernel.Get<DependendsOnIFoo>();
}
private interface IFoo {}
private class Foo : IFoo {}
private class DependendsOnIFoo
{
public DependendsOnIFoo(IFoo foo) {}
}
И пример, где легкий объект заменяется в зависимости от флага:
public void Configure()
{
bool heavy = true;
IKernel kernel = new StandardKernel();
kernel.Bind<IFoo>()
.ToMethod(ctx => heavy ? ctx.Kernel.Get<HeavyFoo>() : (IFoo)new DummyFoo());
DependendsOnIFoo depFoo = kernel.Get<DependendsOnIFoo>();
}
private interface IFoo {}
private class HeavyFoo : IFoo {}
private class DummyFoo : IFoo { }
private class DependendsOnIFoo
{
public DependendsOnIFoo(IFoo foo) {}
}