2017-01-09 82 views
1

我似乎無法找到任何有關此信息,希望有人可以提供幫助。使用Autofac IoC單件共享接口的Hangfire作業

憑藉一流「的TestClass」繼承ITestClass我可以用下面的代碼註冊一個Autofac單:

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

添加作業,以遲髮型也很簡單:

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

我不能什麼似乎弄清楚是如何註冊多個類作爲Autofac單身人士都具有相同的接口和能夠爲特定的單身人士創建一個Hangfire作業。

例如,有一個名爲ITest的接口和使用此接口的類TestClass1,TestClass2和TestClass3,我想爲TestClass2添加一個Hangfire作業。

我想,也許命名爲單身是可以很容易地創建一個解決方案:

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

然而,增加了對TestClass2一個遲髮型工作似乎是不可能的遲髮型只需要一個接口作爲參數和接口現在都有3個相關的單身人士。

我還希望能夠解決所有實現此接口的單例到一個IEnumerable中,這對於命名的單例也是不可能的。

對此有何建議?我猜測命名的單身人士可能是死路一條?

回答

0

我不認爲命名或鍵控服務將幫助你在這裏。我看了一下JobActivator的實現,似乎沒有辦法在解析服務的ActivateJob(Type jobType)方法中找到可用的名稱或密鑰。

然而,加入遲髮型工作的TestClass2似乎是不可能的遲髮型只需要一個接口作爲參數和接口現在有3個相關的單身人士。

我不認爲這是正確的,所以你可以添加作業時,直接使用你的單身類型(TestClass1TestClass2,...)。要做到這一點,你就必須註冊您的單身AsSelf()還有:

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

你仍然能夠解決使用ITestClass接口所​​有的單身人士。如果在添加作業的代碼中無法訪問單例類型,則必須爲每個單例添加一個接口(ITestClass1ITestClass2,...),然後使用這些接口創建作業。

0

謝謝你的回答fknx! :)

我看到通過註冊這樣的:

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

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

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

..將使我使用ITestClass解決他們所有。我沒有看到的是我如何能夠註冊一個Hangfirejob,即TestClass2?

如果我無法訪問單例類型,您的解決方案的建議非常好用!

註冊:

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解決我仍然有機會獲得同樣的方法。

添加遲髮型工作:

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