업무상 유형의 서비스가 있으므로 AccountService
으로 전화하십시오.X로 인수로 인스턴스화해야하는 X에 서비스를 삽입하려면 어떻게해야합니까?
class AccountService : IAccountService {
public AccountService(ILoggingService log) {
_log = log;
}
}
이 서비스는 ctor injection에서 로깅 서비스가 필요합니다. 로깅 서비스는 새로운 인스턴스로 주입됩니다 있도록
var log = LoggingServiceFactory.GetService(typeof(AccountService));
가 어떻게 형식으로 계정 서비스를 전달하는 객체 그래프를 정의합니까 :
로깅 서비스는 유형으로 포함하는 서비스를 전달하는 인스턴스화해야합니까?
나는이
container.RegisterType<IAccountService, AccountService>();
container.RegisterType<ILoggingService>(/* ??? */);
할 수 ...하지만 난 거기에 넣어 모르겠어요.
해야합니까? 이 예를 들어 OK입니다
container.RegisterType<IAccountService>(() => return new AccountService(LoggingServiceFactory.GetService(typeof(AccountService)));
,하지만뿐만 아니라 내 AccountService
필요한 기타 주사하면? 그 모든 람다 표현에 모든 것을 넣어야합니까?
container.RegisterType<IAccountService>(() => return new AccountService(LoggingServiceFactory.GetService(typeof(AccountService)), container.Resolve<IOtherService>(), container.Resolve<ISecondOtherService>());
다른 서비스에서도 다른 서비스 (로깅 서비스를 다시 포함)가 필요한 경우에는 어떻게해야합니까? 이처럼 꽤 지저분해질 수 있습니다.
class AccountService : IAccountService {
public AccountService(LoggingServiceFactory factory) {
_log = factory.GetService(typeof(this));
}
}
그들에게이 방법 등록 :
은 내가 대신 공장을 주입 할 수 있도록 내가 상황을 타개 생각
container.RegisterType<IAccountService, AccountService>();
container.RegisterType<LoggingServiceFactory, LoggingServiceFactory>();
을 ...하지만 ILoggingServiceFactory
이없는 아아 그래서 나는 것 콘크리트 유형을 주입하기 때문에 단위 테스트가 더 어려워집니다. 로깅 서비스를 변경할 수 없습니다 (제 3 자이며이를 사용해야합니다).
더 좋은 방법이 있습니까?
맞아, 그 정도는 알지만 ... LoggingService는 로깅 할 코드가 일치하는'Type' 인수로 인스턴스화해야합니다 (로거가 범위 정보를 내보낼 수 있도록). 어떻게 그 인수를 생성자에 전달합니까? 그것은 질문입니다. –
@ JohnWu Oh ... 그 생성자를 통해 주입되는 것이 아니라 생성자에서 인스턴스화됩니다. fbhdev는 공장을 만드는 데있어서 더 정확합니다. – TyCobb