Как ввести изменяющуюся зависимость - PullRequest
1 голос
/ 08 ноября 2008

Я новичок в внедрении зависимостей, мне интересно, как бы вы справились со следующим сценарием. У нас есть что-то вроде следующего:

public class DatabaseContext
{
  public string ConnectionString {get;}
}

public interface IDataAccess
{
  string GetString(int id);
}

public class DataAccessImpl : IDataAccess
{
  private DatabaseContext _context;
  public DataAccessImpl(DatabaseContext context)
  {
    this._context=context;
  }

  public string GetString(int id)
  {
    return "some data";
  }
}

Для веб-приложений каждый запрос может создавать другой DatabaseContext для указания на другую базу данных. Для оконных форм мы можем изменить текущий DatabaseContext. Как di Framework обрабатывает зависимость, которая может измениться? Таким образом, когда я запрашиваю IDataAccess, он всегда имеет соответствующий / текущий DatabaseContext.

1 Ответ

1 голос
/ 08 ноября 2008

Подход, который я выбрал, заключается не в том, чтобы внедрить DataContext, а в фабрику DataContext, класс с методом, который возвращает DataContext соответствующего типа. У меня есть два конструктора для, в моем случае, класса контроллера конструктор по умолчанию и один, который принимает фабрику (и другие внедренные объекты). Конструктор по умолчанию просто вызывает конструктор с параметрами со всеми параметрами null. Параметризованный конструктор создает объекты типов по умолчанию, если соответствующий параметр имеет значение null.

Использование фабрики позволяет моим действиям контроллера создавать новый DataContext при вызове вместо того, чтобы иметь один DataContext, который существует на протяжении всего жизненного цикла приложения. Фабрику можно построить так, чтобы она возвращала существующий контекст, если он был доступен, и создавала новый по мере необходимости, но я предпочитаю охватывать их единицей работы.

P.S. Фабрика фактически создает класс-оболочку вокруг DataContext, а не фактического DataContext, в качестве интерфейса (IDataContextWrapper). Это значительно облегчает имитацию реальной базы данных из моих тестов контроллера. Все вышеперечисленное предполагает использование LINQ / ASP.NET MVC, но принципы, как правило, применимы, я думаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...