Использование внедрения зависимостей в контроллере с устаревшим кодом - PullRequest
0 голосов
/ 16 октября 2019

Я не могу определить, является ли этот подход чистым для реализации DI (внедрение зависимостей в новом проекте webapi) при использовании устаревшего кода. Я новичок в этой концепции и не осваиваю то, что можно и чего нельзя делать. Я использую следующую статью https://www.technical -recipes.com / 2018 / using-зависимая инъекция в web-api-приложения-using-unity /

Устаревший код включаетBusinessLayer и уровень хранилища, определенные в отдельных проектах, которые я буду использовать в своем проекте API. Мой бизнес-объект принимает объект DataBaseController в качестве параметра в своем конструкторе. Моя главная задача - использовать DI с новыми бизнес-объектами, не нарушая существующую логику. Для бизнес-объектов не определены интерфейсы.

Пример унаследованного бизнес-класса

public class BusinessBase : IDisposable
{
        public UserLogInfo UserLogInfo { get; set; }
        public DataBaseController Dao { get; set; }        


        public BusinessBase(UserLogInfo user)
        {
            this.UserLogInfo = user;
        }

        public BusinessBase(DataBaseController dao, UserLogInfo user)
        {
            UserLogInfo = user;
            Dao = dao;
        }
        public void Dispose()
        {

        }
}

public class PreferenceBusiness : BusinessBase
{

        public PreferenceBusiness(UserLogInfo user) : base(user)
        {
            Dao = new DataBaseController();
        }

        public PreferenceBusiness(DataBaseController dao, UserLogInfo user)
            : base(user)
        {
            Dao = dao;
        }
}

Если я определю свои конструкторы приватно, то воспользуюсь методом для возврата экземпляра, подобного этому

public interface ICheckInDocumentsBusiness
{
     ICheckInDocumentsBusiness CreateInstance(DataBaseController dao,UserLogInfo user);
}

public class CheckInDocumentsBusiness : BusinessBase, ICheckInDocumentsBusiness
    {


        private ICheckInDocumentsBusiness _checkIn;        

        public ICheckInDocumentsBusiness CreateInstance(DataBaseController dao, UserLogInfo user)
        {
            return _checkIn == null ? new CheckInDocumentsBusiness(dao, user) : _checkIn;
        }

        private CheckInDocumentsBusiness(UserLogInfo user) : base(user)
        {
            Dao = new DataBaseController();
        }

        private CheckInDocumentsBusiness(DataBaseController dao, UserLogInfo user)
            : base(dao,user)
        {

        }


    }

Я бы хотелчтобы можно было внедрить мой бизнес-уровень в мой контроллер с параметрами DataBaseController и без параметров UserLogInfo или без них

...