【问题标题】:ServiceStack.Funq.Quartz cannot instantiating type?ServiceStack.Funq.Quartz 无法实例化类型?
【发布时间】:2016-04-21 23:27:25
【问题描述】:

ServiceStack.Funq.Quartz 示例代码是

public class MyServices : Service
{
    public object Any(Hello request)
    {
        return new HelloResponse { Result = "Hello, {0}!".Fmt(request.Name) };
    }
}

public class HelloJob : IJob
{
    private MyServices MyServices { get; set; }
    public HelloJob(MyServices myServices)
    {
        MyServices = myServices;
    }
    public void Execute(IJobExecutionContext context)
    {
        var response = MyServices.Any(new ServiceModel.Hello
        {
            Name = "CodeRevver"
        });
        response.PrintDump();
    }
}

以上工作正常。如果我在 MyServices 类中,删除了 Any 函数,并注释了 Execute 内部代码。

public class MyServices : Service
{

}

quartz.net 会报错:

[Quartz.Core.ErrorLogger】 An error occurred instantiating job to be executed. job= 'JobGroup1.GetUserJob111' Problem instantiating type 'ServiceStackWithQuartz.HelloJob'

为什么类必须有公共对象Any(Hello request)函数?

【问题讨论】:

    标签: servicestack quartz.net funq


    【解决方案1】:

    感谢您使用该软件包 - 我不知道其他人会发现它有用。

    所以如果我理解正确,在你的情况下你有:

    public class MyServices : Service
    {
    }
    

    你正试图通过构造函数注入来解决这个服务,这实际上是在做:

    container.Resolve<MyServices>();
    

    由于 ServiceStack Funq IoC 的工作方式,这将失败。您无法解析其中没有任何内容的 ServiceStack 服务(您可能永远也不想这样做)——它必须至少有一个服务实现,不管实现是什么。

    另外,如果您想改进 ServiceStack.Funq.Quartz,请随时为代码库做出贡献。

    编辑:可能值得一提的是,如果需要,您可以在其中注入包含逻辑的“非服务”类。您可以解析不基于 ServiceStack.Service 的其他类,即使其中没​​有任何内容。

    编辑 2: 响应您的“服务不会处理”问题。这在 ServiceStack 中是相同的,与您的 Quartz Job 无关。如果你打电话给:

    container.Resolve<MyServices>().Any(new new ServiceModel.Hello { });
    

    以 AppHost 为例,您的服务不会自行处理。如果您希望它处理,您可以将其包装在 using 语句中。例如

    using (var service = MyServices)
    {
        var response = MyServices.Any(new ServiceModel.Hello { });
    }
    

    使用将确保您的服务在之后被处置。

    或者您可以将接口“IDispose”添加到您的 Quartz Job 并实现一个 Dispose() 方法,该方法将执行以下操作:

    MyServices.Dispose();  
    

    这将在作业执行后调用。

    【讨论】:

    • 感谢您的回复。是的你是对的。由于 ServiceStack Funq IoC 的方式,它必须至少有一个服务实现,一个服务如果包含(任何、放置、获取、发布..),解析工作正常,但我只需要一些数据库操作,@mythz有什么建议吗?
    • Funq 使用 container.Resolve&lt;T&gt; 进行构造函数注入,这表示强制依赖项,但如果您使用 公共属性,Funq 会使用 container.TryResolve&lt;T&gt; 解析依赖项,这可以是可选的。跨度>
    • 最后,我必须在初始化类中添加 container.RegisterAutoWiredType(typeof(MyServices)); 。但我发现 Quartz.net 作业已执行,它不会调用 Service.Dispose() ,然后如果在 MyService 中调用 Db 操作,它不会关闭连接和 dispose()。 @迈克尔克拉克
    猜你喜欢
    • 2011-08-14
    • 1970-01-01
    • 2014-12-30
    • 2019-07-26
    • 2013-09-27
    • 2015-04-30
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    相关资源
    最近更新 更多