【问题标题】:How configure structuremap for fluentscheduler?如何为 fluentscheduler 配置结构图?
【发布时间】:2014-10-15 19:46:17
【问题描述】:

我有这个结构映射配置和用于 fluentScheduler 的 ITaskFactory。

public class StructureMapRegistry : Registry
{
    public StructureMapRegistry()
    {

        Scan(x =>
        {
            x.AssembliesFromApplicationBaseDirectory();
            x.WithDefaultConventions();
        });
        //implementace daného rozhraní naplní stejně jmenující se třídou.
        For<IPlayerService>().Use<PlayerService>().Singleton();
        For<IWorldService>().Use<WorldService>().Singleton();
        For<IQuestService>().Use<QuestService>().Singleton();
        For<IHeroesService>().Use<HeroesService>().Singleton();
        For<ISaveChangesService>().Use<SaveChangesService>().Singleton();
        For<IAddHeroesQuests>().Use<AddHeroesQuests>().Singleton();
        IncludeRegistry(new IoC());
    }
}

public class StructureMapTaskFactory : ITaskFactory
{
    public ITask GetTaskInstance<T>() where T : ITask
    {
        return ObjectFactory.Container.GetInstance<T>();
    }
}

我遇到了这个异常。

{StructureMap.StructureMapConfigurationException:没有注册默认实例,无法自动确定类型“TheGame.Tasks.IAddHeroesQuests” 没有为 TheGame.Tasks.IAddHeroesQuests 指定配置 1.) Container.GetInstance(TheGame.Tasks.IAddHeroesQuests) v StructureMap.SessionCache.GetDefault(Type pluginType, IPipelineGraph pipelineGraph) v c:\BuildAgent\work\996e173a8ceccdca\src\StructureMap\SessionCache.cs:řádek 63 v StructureMap.BuildSession.GetInstance(Type pluginType) v c:\BuildAgent\work\996e173a8ceccdca\src\StructureMap\BuildSession.cs:řádek 60 v StructureMap.Container.GetInstance(Type pluginType) v c:\BuildAgent\work\996e173a8ceccdca\src\StructureMap\Container.cs:řádek 336 v StructureMap.Container.GetInstance[T]() v c:\BuildAgent\work\996e173a8ceccdca\src\StructureMap\Container.cs:řádek 201 v TheGame.StructureMapTaskFactory.GetTaskInstance[T]() v d:\Programovani\VisualStudio\Testy\TheGame\thegame\TheGame\Global.asax.cs:řádek 101 v FluentScheduler.Registry.b__2[T]() v c:\TeamCity\buildAgent\work\21c2d4ee90f3f489\FluentScheduler\Registry.cs:řádek 50 v System.Threading.Tasks.Task.InnerInvoke() v System.Threading.Tasks.Task.Execute()}

我不知道为什么。

【问题讨论】:

  • 我解决了这个问题。解决方案很简单。我忘了初始化 ObjectFactory。
  • 我正在处理类似的问题,这是我第一次接触 StructureMap3+,您能否发布您所做的代码示例?谢谢!
  • offcourse,此代码需要在应用程序启动中初始化受保护的 void Application_Start() { var container = new Container(new StructureMapRegistry()); var dependencyResolver = new StructureMapDependencyResolver(container); ObjectFactory.Initialize(x => x.AddRegistry(new StructureMapRegistry())); }
  • 这是调度程序 public class StructureMapTaskFactory :ITaskFactory { public ITask GetTaskInstance() where T : ITask { return Container.For().GetInstance() ; } } 公共类 MyRegistry : FluentScheduler.Registry { public MyRegistry() { Schedule().ToRunNow(); //ToRunEvery(1).Days().At(04, 00); //.At(04, 00); } }

标签: c# structuremap fluentscheduler


【解决方案1】:

依赖注入

FluentScheduler 让您可以轻松使用您选择的 IoC 工具来创建作业实例。只需实现 IJobFactory。

使用 StructureMap 的示例:

using FluentScheduler;
using StructureMap;

public class StructureMapJobFactory : IJobFactory
{
    public IJob GetJobInstance<T>() where T : IJob
    {
        return ObjectFactory.Container.GetInstance<T>();
    }
}

public class MyRegistry : Registry
{
    public MyRegistry()
    {
        // Schedule an IJob to run at an interval
        Schedule<MyJob>().ToRunNow().AndEvery(2).Seconds();
    }
} 

向 JobManager 注册新的作业工厂: 这部分在您的代码中丢失。你需要告诉 JobManager.JobFactory 是 StructuremapJobFactory 就像你说你的依赖注入器是这样的。

protected void Application_Start()
{
    JobManager.JobFactory = new StructureMapJobFactory(); // THIS PART IS MISSING ON YOUR CODE
    JobManager.Initialize(new MyRegistry()); 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    相关资源
    最近更新 更多