Вопрос ДИ, считается ли это слабо связанным?

#c# #dependency-injection #inversion-of-control

Вопрос:

Я использую здесь заводской класс для инъекции DataAccess и Logging для моего BusinessLogic , считается ли это слабо связанным?

Я пытаюсь следовать DIP (принцип инверсии зависимостей), IoC (Инверсия контроля) и DIP (Принцип инверсии зависимостей). Я включил в этот пост свои классы и интерфейсы.

Обратите внимание, что я не использую контейнер IoC, может быть, мне стоит это сделать?

 public interface IDataAccess
{
    void SaveData(string data);
}

public interface ILogger
{
    void Log(string str);
}

class Program
{
    public class Logger : ILogger
    {
        public void Log(string str)
        {
            Console.WriteLine("Logging {0}", str);
        }
    }

    public class BusinessLogic
    {
        ILogger _logger;
        IDataAccess _dataAccess;
        public BusinessLogic(Logger logger, DataAccess DataAccess)
        {
            _logger = logger;
            _dataAccess = DataAccess;
        }
        public void ProcessData()
        {
            _logger.Log("Hello!");
            _dataAccess.SaveData("Hey");
        }
    }

    public class DataAccess : IDataAccess
    {
        public void SaveData(string data)
        {
            Console.WriteLine("Saving {0}", data);
        }
    }

    static class Factory
    {
        public static DataAccess getDataAccess()
        {
            return new DataAccess();
        }
        public static Logger getLogger()
        {
            return new Logger();
        }
    }

    static void Main(string[] args)
    {
        BusinessLogic bLogic = new BusinessLogic(Factory.getLogger(), Factory.getDataAccess());
        bLogic.ProcessData();
        Console.ReadLine();
        Console.WriteLine("Hello World!");
    }
}
 

Ответ №1:

считается ли это слабо связанным?

Ваш класс бизнес-логики тесно связан с деталями реализации (конкретные классы)

Бизнес-логика

 //...

ILogger _logger;
IDataAccess _dataAccess;

public BusinessLogic(Logger logger, DataAccess DataAccess) { //<-- classes?
    _logger = logger;
    _dataAccess = DataAccess;
}

//...
 

вместо абстракций (интерфейсы/абстрактные классы).

Бизнес-логика (обновлена)

 //...

ILogger _logger;
IDataAccess _dataAccess;

public BusinessLogic(ILogger logger, IDataAccess DataAccess) { //<-- abstractions
    _logger = logger;
    _dataAccess = DataAccess;
}

//...
 

Приведенный выше обновленный пример теперь отделен от проблем/деталей реализации.

Main похоже, это ваш корень композиции, поэтому просто создайте все необходимые зависимости и явно введите их с помощью pure DI, так что на самом деле статическая фабрика тоже не нужна.

 static void Main(string[] args) {
    ILogger logger = new Logger();
    IDataAccess dataAccess = new DataAccess();
    BusinessLogic bLogic = new BusinessLogic(logger, dataAccess);
    bLogic.ProcessData();
    Console.ReadLine();
    Console.WriteLine("Hello World!");
}
 

Обратите внимание, что я не использую контейнер IoC, может быть, мне стоит это сделать?

Следует ли вам это делать или не следует, является спорным вопросом, и, скорее всего, на него будут даны мнения, выходящие за рамки того, что приемлемо для SO.

Просмотрите статью по ссылке и самостоятельно примите обоснованное решение.

Комментарии:

1. Большое вам спасибо за помощь. Я тоже прочитаю статью.