2017-01-09 1 views
1

나는 이것에 대한 정보를 찾지 못해 누군가가 도울 수 있다고 생각합니다. 나는 다음과 같은 코드를 가진 Autofac 싱글을 등록 할 수 있습니다 클래스 "TestClass에"ITestClass을 상속와 인터페이스를 공유하는 Autofac IoC 싱글 톤을 사용하는 Hangfire 작업

:

builder.RegisterType<TestClass>().As<ITestClass>().SingleInstance(); 

Hangfire에 작업을 추가 마찬가지로 간단합니다 :

RecurringJob.AddOrUpdate<ITestClass>(x => x.MethodInITestClass, Cron.MinuteInterval(1)); 

내가 캔트 무엇 알아낼 것 같다는 것은 여러 개의 클래스를 Autofac 싱글 톤 으로 등록하는 방법이 모두 동일 인터페이스을 가지며 특정 싱글 톤에 대해 Hangfire 작업을 생성 할 수 있다는 것입니다.

예를 들어 ITest라는 인터페이스와이 인터페이스를 사용하는 TestClass1, TestClass2 및 TestClass3 클래스를 가지고 TestClass2에 Hangfire 작업을 추가하고 싶습니다.

어쩌면라는 싱글을 쉽게 만들 수있는 해결책이 될 것이라고 생각 : Hangfire 만 인수로 인터페이스를 취하고 인터페이스가 지금 가지고 그러나

builder.RegisterType<TestClass1>().Named<ITest>("TestClass1").SingleInstance(); 
builder.RegisterType<TestClass2>().Named<ITest>("TestClass2").SingleInstance(); 
builder.RegisterType<TestClass3>().Named<ITest>("TestClass3").SingleInstance(); 

을 TestClass2위한 Hangfire 작업을 추가하는 것은 불가능 보인다 3 개의 관련 싱글 톤.

또한이 인터페이스를 구현하는 모든 싱글 톤을 명명 된 싱글 톤으로는 불가능한 IEnumerable로 해결할 수 있기를 바랍니다.

이것에 대한 조언이 있으십니까? 싱글 톤이라는 이름이 막 다른 골목일지도 모릅니다.

답변

0

나는 네임드 또는 키 서비스가 여기 도움이 될 것이라고 생각지 않습니다. JobActivator 구현을 살펴본 결과 서비스가 해결 된 ActivateJob(Type jobType) 메서드에서 이름이나 키를 사용할 수있는 방법이없는 것처럼 보입니다.

하지만 Hangfire는 인터페이스를 인수로 사용하기 때문에 TestClass2에 대한 Hangfire 작업을 추가하는 것은 불가능합니다. 이제 인터페이스에는 3 개의 관련 싱글 톤이 있습니다. 작업을 추가 직접 때 당신이 당신의 싱글 타입 (TestClass1, TestClass2, ...)를 사용할 수 있도록 내가 이것을 생각하지 않는다

은 올바른 것입니다. 이렇게하려면 당신은뿐만 아니라 당신의 싱글 AsSelf()를 등록해야합니다 :

builder.RegisterType<TestClass>().AsSelf().As<ITestClass>().SingleInstance(); 

당신은 여전히 ​​ITestClass 인터페이스를 사용하여 모든 싱글을 해결 할 수 있습니다. 작업을 추가하는 코드에서 싱글 톤 유형에 액세스 할 수없는 경우 각 싱글 톤 (ITestClass1, ITestClass2, ...)에 대한 인터페이스를 추가하고이 인터페이스를 사용하여 작업을 생성해야합니다.

0

답변 주셔서 감사합니다 fknx! :)

내가 이런 식으로 등록하여 볼 :

builder.RegisterType<TestClass1>().AsSelf().As<ITestClass>().SingleInstance(); 

builder.RegisterType<TestClass2>().AsSelf().As<ITestClass>().SingleInstance(); 

builder.RegisterType<TestClass3>().AsSelf().As<ITestClass>().SingleInstance(); 

있습니다 .. ITestClass를 사용하여 그들 모두를 해결하기 위해 나를 수있다. 내가보기에는 내가 TestClass2를 위해 Hangfirejob을 어떻게 등록 할 수 있을까?

싱글 톤 유형에 액세스 할 수 없다면 해결책에 대한 제안이 훌륭하게 작동합니다!

등록 :

builder.RegisterType<TestClass1>().As<ITestClass1>().As<ITestClass>().SingleInstance(); 

builder.RegisterType<TestClass2>().As<ITestClass2>().As<ITestClass>().SingleInstance(); 

builder.RegisterType<TestClass3>().As<ITestClass3>().As<ITestClass>().SingleInstance(); 

또한, 내가 ITestClassX 또는 ITestClass에 의해 해결 만약 내가 여전히 같은 방법에 액세스 할 수 있도록 ITestClassX이 ITestClass을 상속합니다.

Hangfire 작업 추가 :

RecurringJob.AddOrUpdate<ITestClass2>("JobTitle", x => x.DoAJob(), Cron.MinuteInterval(5)); 
관련 문제