.net 使用Nancy+;TinyIoC通过Quartz JobFactory注入依赖项
所以我使用Nancy+TinyIoC来运行一个小型Web服务。这很有效。现在,我需要创建一个Quartz作业,它需要一些相同的依赖项,理想情况下,我希望使用Nancy的TinyIoC注入这些依赖项,如中所述 我在温莎找到了一个这样的例子,他们直接访问IoC容器,但在南希,根据这里提出的类似问题,这显然是粗糙和不必要的 我的问题是,正确的方法是什么?my 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
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是否为我们做到了这一点?在多线程环境中公开一个静态的、可变的、有状态的对象通常不是一个好主意。如果有可能滥用它,就会有人滥用。