#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. Это то, что я искал.. Спасибо!!