1

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)クラスにパブリックオブジェクト関数が必要なのはなぜですか?

4

1 に答える 1

2

パッケージをご利用いただきありがとうございます。他の人がこのパッケージを便利だと思うとは思いもしませんでした。

したがって、私が正しく理解している場合、あなたの状況では次のようになります。

public class MyServices : Service
{
}

そして、コンストラクターインジェクションを介してこのサービスを解決しようとしています。これは、効果的に次のことを行っています。

container.Resolve<MyServices>();

これは、ServiceStack Funq IoC の動作が原因で失敗します。何も含まれていない ServiceStack サービスを解決することはできません (おそらく解決したくないでしょう)。少なくとも 1 つのサービス実装が必要です。実装が何であるかは問題ではありません。

また、ServiceStack.Funq.Quartz を改善したい場合は、気軽にコード ベースに貢献してください。

編集: 必要に応じて、ロジックを含む「非サービス」クラスを挿入できることに言及する価値があるでしょう。何も含まれていない場合でも、ServiceStack.Service に基づいていない他のクラスを解決できます。

編集2: 「サービスが処分しない」問題への対応。これは ServiceStack 全体で同じであり、Quartz ジョブとは関係ありません。あなたが呼び出す場合:

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

たとえば、AppHost から、サービスはそれ自体で破棄されません。破棄したい場合は、using ステートメントでラップできます。例えば

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

使用すると、サービスが後で破棄されることが保証されます。

または、インターフェイス「IDispose」を Quartz ジョブに追加し、次のことを行う Dispose() メソッドを実装することもできます

MyServices.Dispose();  

これは、ジョブの実行後に呼び出されます。

于 2016-04-23T10:26:52.333 に答える