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函数,并注释执行内部代码。
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)
函数?
答案 0 :(得分:2)
感谢您使用该软件包 - 我不知道其他人会发现它有用。
所以,如果我理解正确,在你的情况下,你有:
public class MyServices : Service
{
}
并且您正尝试通过构造函数注入来解析此服务,这有效地执行了:
container.Resolve<MyServices>();
由于ServiceStack Funq IoC的工作方式,这将失败。您无法解析其中没有任何内容的ServiceStack服务(您可能永远不会想要) - 它必须至少有一个服务实现,实现是什么并不重要。
此外,如果您想改进ServiceStack.Funq.Quartz,请随时为代码库做出贡献。
编辑:可能值得一提的是,您可以注入&#34;非服务&#34;如果你愿意,可以使用你的逻辑课程。您可以解决其他基于ServiceStack.Service的类,即使它们中没有任何内容。
编辑2:回复您的&#34;服务不会处置&#34;问题。这与ServiceStack相同,与Quartz Job无关。如果你打电话给:
container.Resolve<MyServices>().Any(new new ServiceModel.Hello { });
例如,来自AppHost,您的服务不会自行处理。如果你想要它处理你可以将它包装在using语句中。 e.g。
using (var service = MyServices)
{
var response = MyServices.Any(new ServiceModel.Hello { });
}
使用可确保您的服务随后处理。
或者您可以添加界面&#34; IDispose&#34;在你的Quartz Job上实现一个Dispose()方法,它将执行:
MyServices.Dispose();
这将在作业执行后调用。