3

저는 솔루션에서 IoC를 구현하기 위해 Autofac을 사용하고 있습니다.하지만 제가 올바르게하고 있는지 아닌지는 의문입니다. 이 시나리오는 다음과 같습니다.
Manager 클래스는 모두 BaseManager 클래스에서 파생됩니다. BaseManager에는 protected User CurrentUser 필드가 있습니다. 내가하려는 일은 Autofac을 사용하여 CurrentUser을 해결하는 것입니다. IUserProvider 인터페이스를 작성하고 몇 가지 클래스 (예 : WebUserProviderWinformsUserProvider)를 구현했습니다. ? 내가 싱글 또는 서비스 로케이터 패턴을 사용할 수 있습니다) 나는 의존성 (내 수업에 액세스 container를 해결할 수있는 방법올바른 방법으로 의존적 인 주입 사용

builder.Register(c => new WebUserProvider(...)).As<IUserProvider>(); 
  • 하지만 보인다
    그럼 예를 들어, Global.asax)에 (아래 내 업체 등록 그것이 anti-pattern을처럼. 어떻게 내가 내 의존성을 해결해야합니까?이 나에게 overengineering 같은 소리

답변

5

을. 왜 사용자의 지식을 가진 기본 관리자 클래스를 것? 하 v약간의 관리자 클래스는 너무 많이 추상화되어 있기 때문에 코드 냄새와 유지 관리 위험이 따릅니다. 정말이 필요합니까?

어떻게하면 종속성을 해결할 수 있습니까 (내 수업의 컨테이너에 액세스)?

용기에 액세스 할 방법을 찾고 있으면 안됩니다. 컨테이너 은 한 번에 한 번만 초기화해야합니다. 생성자를 통해 모든 종속성을 주입해야합니다. 이러한 종속성은 container.Resolve<T>을 사용하여 종속성 그래프의 루트에서 전달되고 생성자 삽입을 사용하는 종속성 그래프의 다른 위치에서 (또는 일부 사용자는 속성 주입을 사용하여) 전달됩니다.

+0

로깅 목적 때문에 BaseManager를 정의하고 거기에 CurrentUser를 초기화해야했습니다. (나는 현재 관리자 클래스의 모든 메소드에 현재 사용자를 전달하고 싶지 않습니다.) "컨테이너는 한 번에 한 곳에 초기화해야합니다"라고 말했으므로 Service Locator와 싱글 톤이 안티 패턴 인 경우 초기화 할 항목과 단일 컨테이너에 액세스 하시겠습니까? – Kamyar

+2

이것은 WinForms 앱인 경우 엔트리 포인트 (main method)에 가까운 곳에서 컨테이너를 만들고 설정할 수 있습니다. 메인에서는 인터페이스를 해석하여 멤버에게 전달합니다. ASP.NET에서는 global.asax에서 설정 한 다음 [예]와 같이 팩토리를 등록 할 수 있습니다 (http://stackoverflow.com/questions/5124393/setting-up-inversion-of-control-ioc). -in-asp-net-mvc-with-castle-windsor)를 사용합니다. 따라서 DI와 IoC에서는 모든 종속 클래스가 추상화 된 추상화를 가지고 있으며 명시 적으로 요청하지 않습니다. – oleksii

관련 문제