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

.net 使用Nancy+;TinyIoC通过Quartz JobFactory注入依赖项,.net,quartz.net,nancy,tinyioc,.net,Quartz.net,Nancy,Tinyioc,所以我使用Nancy+TinyIoC来运行一个小型Web服务。这很有效。现在,我需要创建一个Quartz作业,它需要一些相同的依赖项,理想情况下,我希望使用Nancy的TinyIoC注入这些依赖项,如中所述 我在温莎找到了一个这样的例子,他们直接访问IoC容器,但在南希,根据这里提出的类似问题,这显然是粗糙和不必要的 我的问题是,正确的方法是什么?my JobFactory的代码如下所示: public class MyJobFactory : IJobFactory { public

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

我在温莎找到了一个这样的例子,他们直接访问IoC容器,但在南希,根据这里提出的类似问题,这显然是粗糙和不必要的

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

public class MyJobFactory : IJobFactory
{
    public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
    {
        return (IJob) TinyIoCContainer.Current.Resolve(bundle.JobDetail.JobType);
    }
}
TinyIoCContainer.Current.Register<SomeType>().AsSingleton();
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);
}
但这不会返回具有正确注入的实例的作业,而是返回具有依赖项的新实例的作业。(应该是单件的,这让我相信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);
    }
}
更新 对不起。我以为你的Quartz工作是在一个单独的项目中,你用它来安排对你的基于Nancy的Web服务的呼叫。我知道石英的工作在Nancy项目中

我想你可以无视我最初的回答:——)

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

public class MyJobFactory : IJobFactory
{
    public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
    {
        return (IJob) TinyIoCContainer.Current.Resolve(bundle.JobDetail.JobType);
    }
}
TinyIoCContainer.Current.Register<SomeType>().AsSingleton();
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
解析的接口依赖项和抽象类依赖项。其他所有内容都是使用
多实例工厂注册的

然后,您可以将其更改为:

private ObjectFactoryBase GetDefaultObjectFactory(Type registerType, Type registerImplementation)
{
    return new SingletonFactory(registerType, registerImplementation);
}
这让我相信TinyIoCContainer.Current返回的TinyIoCContainer与Nancy使用的容器不同)

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


如果您绝对必须使用服务位置,并且无法仅使用构造函数注入,则可以在引导程序中重写GetApplicationContainer方法并返回.Current实例,以便Nancy使用该实例。默认情况下,我们不会使用它,因为这不是我们推荐的内容

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

public class Bootstrapper : DefaultNancyBootstrapper
{
    public static TinyIoCContainer Container { get; private set; }

    protected override void ConfigureApplicationContainer(TinyIoCContainer container)
    {
        Container = container;
    }
}
当使用

Bootstrapper.Container.Resolve(...)

谢谢我更新了我的问题,以便更好地解释我是如何使用TinyIoC的。啊,明白了。我误解了你的问题。如中所述,当使用ASP.NET时,它需要调用
.AsPerRequestSingleton()
。Nancy bootstrapper是否为我们做到了这一点?在多线程环境中公开一个静态的、可变的、有状态的对象通常不是一个好主意。如果有可能滥用它,就会有人滥用。