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

时间:2012-10-12 12:03:06

标签: .net quartz.net nancy tinyioc

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

我找到了一个使用Windsor的例子,他们直接访问了IoC Container,但是根据这里提出的类似问题,南希显然是粗暴的,不必要的。

然后我的问题必须是,这样做的正确方法是什么?我的JobFactory的代码如下所示:

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

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

更新
我正在通过Nancy Bootstrapper设置IoC容器:

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

3 个答案:

答案 0 :(得分:5)

  

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

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

如果您绝对必须使用服务位置,并且您无法使用构造函数注入,则可以覆盖引导程序中的GetApplicationContainer方法并返回.Current实例,以便Nancy将使用它。我们默认不使用它,因为它不是我们推荐的

答案 1 :(得分:0)

更新

对不起我认为您的Quartz作业是在一个单独的项目中,并且您正在使用它来安排对基于Nancy的Web服务的调用。我知道Quartz的工作是里面的 Nancy项目。

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

原始答案

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

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

我正在使用AutoRegister功能,并且您使用的依赖项不是接口或抽象类类型,并且您希望 all 您的依赖项是单例,您将需要更改TinyIoC中的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);
}

答案 2 :(得分:0)

我认为@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(...)