Прелесть чистого DI в том, что вам не нужно беспокоиться о времени жизни ваших зависимостей , потому что ими управляет тот, кто их поставляет (Контейнер DI или какой-то другой код, который вы написали сами) ).
(Кроме того, вы должны избавиться от своих текущих Bastard Injection . Выбросьте конструктор без параметров и оставьте тот, который явно объявляет его зависимости.)
Держите ваш конструктор таким, как он, и используйте _IRepository и _IBusinessRepository по мере необходимости:
public CACSService(IUserRepository Repository, IBusinessRepository businessRepository)
{
_IRepository = Repository;
_IBusinessRepository = businessRepository;
}
Если вы беспокоитесь, что один из этих репозиториев не понадобится во время выполнения, вы можете внедрить реализацию с отложенной загрузкой, скажем, IUserRepsository вместо реальной, которую вы изначально имели в виду.
Предположим, что IUserRepository выглядит следующим образом:
public interface IUserRepository
{
IUser SelectUser(int userId);
}
Теперь вы можете реализовать реализацию с отложенной загрузкой, например:
public class LazyUserRepository : IUserRepository
{
private IUserRepository uRep;
public IUser SelectUser(int userId)
{
if (this.uRep == null)
{
this.uRep = new UserRepository();
}
return this.uRep.SelectUser(userId);
}
}
Когда вы создаете CACService, вы можете сделать это, вставив в него LazyUserRepository, который гарантирует, что реальный UserRepository будет инициализирован только в случае необходимости.
Прелесть этого подхода в том, что вам не нужно делать это, пока вам это не нужно . Зачастую это действительно не требуется, поэтому приятно иметь возможность откладывать такие оптимизации до тех пор, пока они действительно не потребуются.
Я впервые описал технику Ленивые зависимости здесь и здесь .