Как внедрить класс в конструктор другого класса?

#c# #dependency-injection #dependencies

#c# #внедрение зависимостей #зависимости

Вопрос:

У меня есть три проекта com.comman, com.business в одном решении и com.xyz в другом решении.

В com.comman у меня есть один класс, скажем, logger, он принимает один параметр в конструкторе. Итак, в com.business я ссылаюсь на commans DLL и создаю logger obj как var obj=new logger(«MIS»);

Вот так я хочу создать объект logger в com.xyz, но без ссылки на com.comman dll. Возможно ли этого добиться?

ПРИМЕЧАНИЕ: из com.business project я вызываю один из классов с именем «ABC» из com.xyz, который снова вызывает другой класс «PQR» в com.xyz. Я хочу создать объект logger в классе PQR.

Пожалуйста, направьте меня!!

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

1. вы говорите о разных решениях или проектах? Я не думаю, что вы можете сделать это, не связывая один проект с другим. Вероятно, вы можете динамически загружать DLL и использовать отражение, если вы абсолютно не хотите использовать ссылку..

2. Да, два разных решения, com.comman, com.business находятся в одном решении, а com.xyz — в другом решении.

Ответ №1:

Я предполагаю, что сборке com.xyz не разрешено ссылаться на сборку com.comman , поскольку com.xyz она находится в другом решении, и это решение уже ссылается на com.xyz .

Это означает, что PQR класс не может зависеть от com.comman.Logger . Тем не менее, вы хотите иметь возможность внедрить этот регистратор PQR .

Способ решить эту проблему — определить абстракцию / интерфейс com.xyz и позволить PQR зависеть от этого интерфейса. Например:

 // Logger abstraction specifically tailored at the needs of com.xyz
public class ILogger {
    void Log(string message);
}

public class PQR {
    private readonly ILogger logger;
    public PQR(ILogger logger) {
        if (logger == null) throw new ArgumentNullException("logger");
        this.logger = logger;
    }
    // PQR methods
}
 

Существование этой новой com.xyz.ILogger абстракции позволяет вам создать адаптер, который сопоставляется с com.xyz.ILogger to com.comman.logger . Этот адаптер должен быть расположен в решении com.business . Наиболее предпочтительным местом для этого является корень композиции. Корнем композиции, скорее всего, будет сборка, которая ссылается на ваш com.business , но если com.business это ваш начальный проект, это будет место для создания адаптера.

Этот адаптер может выглядеть следующим образом:

 public class ComXyzLoggerAdapter : com.xyz.ILogger {
    private com.comman.logger logger;
    ComXyzLoggerAdapter(com.comman.logger logger)
        this.logger = logger;
    }

    public void Log(string message) {
        // Here we map from com.xyz.ILogger to comman.Logger 
        this.logger.LogError(message);
    }
}
 

В том месте, где вы создаете PQR класс (в com.business решении), вам теперь нужно будет сделать это:

 var abc =
    new ABC(
        new QPR(
            new ComXyzLoggerAdapter(
                new com.comman.logger("MIS"))));
 

То, что мы здесь сделали, в основном применяло принцип инверсии зависимостей.

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

1. Это то, что я искал.. Спасибо!!