Ответ 1
Вы можете изменять поведение инъекций путем связывания с помощью метода factory (т.е. ToMethod
), и можно разрешить впрыскивание нулей путем настройки контейнера AllowNullInjection
.
Другой альтернативой может быть использование метода factory и снабжение легким фиктивным объектом вместо вашего тяжеловесного класса. Если вы используете интерфейсы, это было бы просто, просто реализованы интерфейсы, которые ничего не делают. Вы могли бы даже использовать насмешливую структуру, такую как FakeItEasy, для создания этих манекенов для вас. Преимущество здесь заключается в том, что манекен делает особое поведение прозрачным для клиентов, то есть клиентам не нужно проверять наличие null
и т.д.
Пример использования метода factory плюс AllowNullInjection
и nulls:
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) {}
}