6

MVC Web サイトに Hangfire パッケージをインストールしました。Startup クラスを作成しました

[assembly: OwinStartup(typeof(Website.Startup))]

namespace Website
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            Hangfire.ConfigureHangfire(app);
            Hangfire.InitializeJobs();
        }
    }
}

と Hangfire クラス

public class Hangfire
{
    public static void ConfigureHangfire(IAppBuilder app)
    {
        app.UseHangfire(config =>
        {
            config.UseSqlServerStorage("DefaultConnection");
            config.UseServer();
            config.UseAuthorizationFilters(); 
        });
    }

    public static void InitializeJobs()
    {
        RecurringJob.AddOrUpdate<CurrencyRatesJob>(j => j.Execute(), "* * * * *");
    }
}

また、別のクラス ライブラリに新しいジョブを作成しました

public class CurrencyRatesJob
{
    private readonly IBudgetsRepository budgetsRepository;

    public CurrencyRatesJob(IBudgetsRepository budgetsRepository)
    {
        this.budgetsRepository = budgetsRepository;
    }

    public void Execute()
    {
        try
        {
            var budgets = new BudgetsDTO();
            var user = new UserDTO();

            budgets.Sum = 1;
            budgets.Name = "Hangfire";
            user.Email = "email@g.com";

            budgetsRepository.InsertBudget(budgets, user);
        }
        catch (Exception ex)
        {
            var message = ex.ToString();
            throw new NotImplementedException(message);
        }
    }
}

そのため、アプリケーションを実行すると、Hangfire のダッシュボードに次のエラーが表示されます。

Failed An exception occurred during job activation.
System.MissingMethodException

No parameterless constructor defined for this object.

System.MissingMethodException: No parameterless constructor defined for this object.
   at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
   at System.Activator.CreateInstance(Type type, Boolean nonPublic)
   at System.Activator.CreateInstance(Type type)
   at Hangfire.JobActivator.ActivateJob(Type jobType)
   at Hangfire.Common.Job.Activate(JobActivator activator)

だから、私はここで少し迷っています。私は何が欠けていますか?

4

4 に答える 4

5

使用している IoC コンテナーに Hangfire を接続していないようです。そのため、デフォルトの戦略を使用して要求された型を作成します。具体的な例では、次の呼び出しを意味します。

System.Activator.CreateInstance(typeof(CurrencyRatesJob));

CurrencyRatesJobクラスにはデフォルトのパラメーターなしのコンストラクターがないため、これは質問に表示されるエラー メッセージで失敗します。

Hangfire を IoC インフラストラクチャに接続するには、メソッドをオーバーライドし、構成された IoC コンテナーを使用して要求されたジョブ タイプのインスタンスを作成する独自のJobActivatorクラスを作成する必要があります。ActivateJob

Unity をコンテナーとして使用する例 ( UnityJobActivator) はここFunqにあり、コンテナー ( FunqJobActivator)の例はここにあります。

このプロセスはHangfire のドキュメントで説明されており、いくつかのコンテナ タイプの標準実装はHangfire github リポジトリから入手できます。

于 2015-05-04T17:56:41.937 に答える