2017-01-09 89 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));