Создать экземпляр класса, который имеет зависимость без Constructor Injection или ServiceLocator - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть класс-оболочка SessionData, зарегистрированный в Autofac, в котором IHttpContextAccessor вставлен в его конструктор;Затем у меня есть класс Parser, используемый для замены токенов в строке значениями из разных источников, пользователь может создать экземпляр класса Parser в любом месте кода, но одному из IAccessor, используемому Parser, нужен экземпляр SessionData.В устаревшей версии этого кода использовался шаблон ServiceLocator;Я пытаюсь избежать этого любой ценой, я также не хочу использовать инъекцию конструктора, потому что я не хочу, чтобы конструкторы стали неуправляемыми;Кто-нибудь может дать мне какое-то направление?

// пожалуйста, извините за ошибки в псевдокоде, который следует за

// wrapper class to access values stored in Session
public class SessionData {
  public SessionData(IHttpConextAccessor) {...}
}

// class used to replace tokens in strings throughout the application
public class Parser {
  public Parser() {...}
  public string Parse(string value) {
    ...
    foreach(var token in GetTokens(value)) {
      if(token.type == "session") {
        var accessor = new SessionAccessor();
        token.value = accessor.GetValue(token.key)
        // replace tokens in value
      }
      ...
      // 20 different types of accessors
    }
  }
}

// interface for all Accessors
public interface IAccessor { 
  string GetValue(string key);  
}

// Accessor to get values from Session
public class SessionAccessor {
  SessionData _sessionData;
  public SessionAccessor(SessionData sessionData) {
    _sessionData = sessionData;
  }
}
...