使用Nancy+TinyoC通过Quartz JobFactory注入依赖项



所以我使用Nancy+TinyIoC来运行一个小型Web服务。这是有效的。现在我需要创建一个Quartz作业,它需要一些相同的依赖项,理想情况下,我想使用Nancy的TinyIoC来注入这些依赖项,如Quartz教程中所述。

我发现了一个使用Windsor的例子,在这个例子中,他们直接访问IoC Container,但在Nancy中,根据这里提出的类似问题,这是粗鲁和不必要的。

我的问题是,正确的方法是什么?我的JobFactory代码如下:

public class MyJobFactory : IJobFactory
{
public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
return (IJob) TinyIoCContainer.Current.Resolve(bundle.JobDetail.JobType);
}
}

但这并不会返回一个具有正确注入实例的作业,而是一个具有依赖项的新实例的作业。(应该是Singleton,这让我相信TinyIoCContainer.Current返回的TinyIoCC容器与Nancy使用的容器不同)。

更新
我正在通过Nancy引导程序设置IoC容器:

public class MyBootStrapper : DefaultNancyBootstrapper
{
protected override void ConfigureApplicationContainer(TinyIoCContainer container)
{
var push = new PushService();
// object initialization and Event Registration snipped
container.Register(cp);
}
}

让我相信TinyIoCContainer.Current返回的TinyIoCC容器与Nancy使用的容器不同)。

把它放在一个:-)中。Current是一个静态实例,我们可能应该从Nancy版本的tinyioc.cs文件中删除它——它与引导程序使用的实例不同。

如果您绝对必须使用服务位置,并且不可能只使用构造函数注入,那么您可以在引导程序中重写GetApplicationContainer方法并返回.Current实例,这样Nancy将使用该实例。默认情况下,我们不使用它,因为我们不推荐

更新

对不起。我以为你的Quartz工作是在一个单独的项目中,你用它来安排打电话给你的Nancy网络服务。我知道Quartz的工作是Nancy项目内部的

我想你可以忽略我原来的答案:-)

原始答案

您是否指定要将这些依赖项注册为单例?你可以这样做:

TinyIoCContainer.Current.Register<SomeType>().AsSingleton();

如果您正在使用AutoRegister功能,并且您使用的依赖项不是接口或抽象类类型,并且您希望所有依赖项都是singleton,则需要在TinyoC中更改GetDefaultObjectFactory

默认情况如下:

private ObjectFactoryBase GetDefaultObjectFactory(Type registerType, Type registerImplementation)
{
//#if NETFX_CORE
//if (registerType.GetTypeInfo().IsInterface() || registerType.GetTypeInfo().IsAbstract())
//#else
if (registerType.IsInterface() || registerType.IsAbstract())
//#endif
return new SingletonFactory(registerType, registerImplementation);
return new MultiInstanceFactory(registerType, registerImplementation);
}

正如您所看到的,它注册了要使用SingletonFactory解析的接口依赖项和抽象类依赖项。其他所有内容都使用MultiInstanceFactory进行注册。

然后您可以将其更改为:

private ObjectFactoryBase GetDefaultObjectFactory(Type registerType, Type registerImplementation)
{
return new SingletonFactory(registerType, registerImplementation);
}

我认为@Steven的信息很棒。然后,我得到了另一个解决方案,将Bootstrap IoC公开为静态属性。

public class Bootstrapper : DefaultNancyBootstrapper
{
public static TinyIoCContainer Container { get; private set; }
protected override void ConfigureApplicationContainer(TinyIoCContainer container)
{
Container = container;
}
}

使用时。。。

Bootstrapper.Container.Resolve(...)

相关内容

  • 没有找到相关文章

最新更新