문제

최근에 사용을 시작했습니다 IOC 컨테이너는 처음으로 컨테이너를 사용하는 모범 사례에 대해서는 교육을받지 않았습니다. 더 구체적으로 사용하고 있습니다 단일성 C# .NET 프로젝트에서 함께 제공 되었기 때문에 사용하기 시작했습니다. 프리즘.

컨테이너를 사용하여 "최상위"객체를 해결하고 컨테이너를 기반으로 올바른 객체를 주입합니다. 그러나 어린이와 어린이의 어린이가있는 물체가있을 때 모범 사례를 명확하게 볼 수 없으며 IOC 컨테이너의 데이터가 완전히 필요하지만 그 사이에는 없습니다. 일반적으로 IOC 컨테이너 사용을 어떻게 구성합니까?

처음에는 최상위 수준의 컨테이너에서 필요한 데이터를 추출 하고이 데이터를 전달하는 대신 필요한 컨테이너를 전달할 것이라고 생각합니다. 그러나 다시 주입 된 인터페이스 외에 다른 특정 데이터를 취하는 객체에 도달하면 문제가 발생하며 객체를 해결 한 후 속성이나 초 모드를 통해 이들을 주입하지 않기를 원합니다.

나는 이것이 충분히 분명하기를 바랍니다. 그러나 가상의 (그리고 약간 어리석은 것) 예를 들여다 보자.

class Employee
{
    private ICommands _commands; 
    priate List<Customer> _customers = new List<Customer>(); 
    public Employee(ICommands commands)
    {
        _commands = commands; 
    }
    public void AddCustomer(string customerName)
    {
        var customer = new Customer(customerName, _commands); 
        _customers.Add(customer); 
    }
}

class Customer 
{
    private string _name; 
    private ICommands _commands; 
    priate List<Case> _cases = new List<Case>(); 
    public Customer(string, name, ICommands commands)
    {
        _name = name; 
        _commands = commands; 
    }
    public void AddCase()
    {
        var case = new Case(_commands); 
        _cases.Add(case); 
    }
}

class Case    {
    private ICommands _commands; 
    public Customer(ICommands commands)
    {
        _commands = commands; 
    }
    public void TriggerCommands()
    {
        _command.TriggerSomething(); 
    }
}

따라서이 예는 실제로 의미가 없지만 본질은 내가해야 할 일과 동일합니다. 뷰 모델 클래스를 통해 줄을 전달하는 응용 프로그램 명령이 있습니다. 일부는 무언가를 표시하기 위해 명령을 트리거 할 수 있어야하기 때문입니다. 또한 일부 클래스에 필요할 수 있지만 현재 중산층에 전달되고 저장된 공통 저장소가 있습니다. 명령 만 있으면 명령이나 컨테이너를 저장하는 경우 큰 문제는 아니지만 일반적인 IOC 사용이 IOC 컨테이너를 대신 통과하고이를 사용하여 객체를 라인 아래로 해결하는 데 사용합니까? 그리고 고객 이름과 같은 특정 데이터는 어떻습니까? resolve ()에 이것을 전달할 수 없으므로 나중에 주사해야합니까?

죄송합니다 - 이것은 내가 만들 수 있었던 것만 큼 짧았습니다. 같은 길이의 답변이 필요하지 않습니다 ;-) .. 그냥; IOC 컨테이너로 이와 같은 일을하는 가장 모범 사례는 무엇입니까?

도움이 되었습니까?

해결책

나는 당신의 질문을 이해하는지 확실하지 않습니다. 그러나 나는 당신이 용기를 전혀 지나쳐야한다고 생각하지 않습니다. 컨테이너의 래퍼 클래스 만 만드는 것이 훨씬 쉽습니다. 예를 들어:

public class IoCContainer
{
  private static ContainerType = null;

  public static ContainerType Instance 
  {
    get 
    {
      if (_container == null)
      {
        string configFileName = ConfigurationManager.AppSettings[ConfigFileAppSettingName];
        _container = new WindsorContainer(new XmlInterpreter(configFileName));
      }

      return _container;
    }
  }
}

이제 코드의 모든 곳에서 이것을 호출합니다.

IoCContainer.Instance.Resolve<IAwesomeService>(); 

이것이 당신에게 도움이됩니까?

다른 팁

이것이 귀하의 질문에 답변하는지 확실하지 않지만 Unity 컨테이너 (내가 생각하는 다른 IOC 엔진에도 적용 가능)를 사용하여 응용 프로그램에서 행동하는 좋은 방법은 다음과 같습니다.

  • 모든 필요한 종속성이 생성자에 지정되도록 클래스를 설계하십시오. 이렇게하면 새 개체를 만들어야하지 않는 한 Unity를 명시 적으로 처리 할 필요가 없습니다.
  • 클래스 내에서 새 객체를 만들어야하는 경우 Unity 컨테이너 자체를 생성자에 전달하십시오 (참조대로IUnityContainer), 그리고 사용하여 모든 새 개체 인스턴스를 만듭니다. Resolve방법. 등록되지 않고 종속성이없는 개체의 경우에도 컨테이너는 적절한 인스턴스를 제공하며 나중에 클라이언트 코드를 변경하지 않고 이전에 등록되지 않은 유형을 등록하기로 결정할 수 있습니다.
  • 분해 된 객체에 명시적인 값을 전달하는 것은 유형을 등록 할 때 콘크리트 주입 멤버를 지정할 수 있습니다 ( InjectionMembers 매개 변수 RegisterType 수업).

당신은 당신의 단체에 대한 공장을 선언 해야하는 것 같습니다. 생성자 주입을 통해 공장을 해결하고 생성 방법을 통해 데이터 값을 전달하십시오. 다른 모든 종속성은 Factory의 생성자를 통해 해결해야합니다.

보다 이것 대답.

정적 클래스 IOC를 정의하고 특정 컨테이너로 초기화하고 Resolve, Resolve (...)와 같은 메소드를 구현할 수 있으며, 이는 실제 작업을 컨테이너 인스턴스에 위임합니다 (이 인스턴스를 필드 또는 재산). 이렇게하면 아무것도 전달할 필요가 없습니다.

IoC.Resolve<SomeType>();

코드의 어느 곳에서나.

특정 데이터와 관련하여 : 일부 컨테이너는이 매개 변수에 따라 매개 변수를 가져 와서 해결합니다 (AutoFac에는 이러한 종류의 기능이 있습니다). 또는 항상 고객 이름과 같은 매개 변수 세트를 수락하는 메소드를 갖고 해당 객체 인스턴스를 반환하는 메소드를 만들 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top