2017-10-12 13 views
0

私のアプリケーションでHangfireを使用して(外部APIから)通貨換算レートを毎日取得し、アプリケーションデータベースに挿入しようとしています。 は正常に設定(そう思う)とHangfireテーブルがDBに作成され、ジョブテーブルは、それが失敗したとHangfireを使用して定期的なジョブを作成中にエラーが発生しました

{"FailedAt":"2017-10-12T07:55:00.3075439Z", 
    "ExceptionType":"System.MissingMethodException", 
    "ExceptionMessage":"Cannot create an instance of an interface.", 
    "ExceptionDetails":"System.MissingMethodException: Cannot create an instance of an interface.\r\n 
    at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)\r\n 
    at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)\r\n 
    at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)\r\n 
     at System.Activator.CreateInstance(Type type, Boolean nonPublic)\r\n at System.Activator.CreateInstance(Type type)\r\n at Hangfire.JobActivator.ActivateJob(Type jobType)\r\n 
     at Hangfire.JobActivator.SimpleJobActivatorScope.Resolve(Type type)\r\n at Hangfire.Server.CoreBackgroundJobPerformer.Perform(PerformContext context)\r\n 
     at Hangfire.Server.BackgroundJobPerformer.<>c__DisplayClass8_0.<PerformJobWithFilters>b__0()\r\n 
     at Hangfire.Server.BackgroundJobPerformer.InvokePerformFilter(IServerFilter filter, PerformingContext preContext, Func`1 continuation)\r\n 
     at Hangfire.Server.BackgroundJobPerformer.<>c__DisplayClass8_1.<PerformJobWithFilters>b__2()\r\n 
     at Hangfire.Server.BackgroundJobPerformer.PerformJobWithFilters(PerformContext context, IEnumerable`1 filters)\r\n 
     at Hangfire.Server.BackgroundJobPerformer.Perform(PerformContext context)\r\n 
     at Hangfire.Server.Worker.PerformJob(BackgroundProcessContext context, IStorageConnection connection, String jobId)"} 
ようなエラー・メッセージを有する示しエントリを有しているが、ジョブが正常に実行されておらず、状態テーブルを確認しながら使用

コード:メソッドを持ってい

public partial class Startup 
     { 
      public void Configuration(IAppBuilder app) 
      { 
       ConfigureAuth(app); 
GlobalConfiguration.Configuration.UseSqlServerStorage("ERPContext"); 

       RecurringJob.AddOrUpdate<IAPIRequest>(x => x.ProcessCurrencyConversion(), Cron.MinuteInterval(1)); 
       app.UseHangfireDashboard(); 
       app.UseHangfireServer(); 

      } 
     } 

インタフェースとクラスに

public interface IAPIRequest 
    { 
     void ProcessCurrencyConversion(); 
    } 

public class APIRequest : IAPIRequest 
    { 
     public void ProcessCurrencyConversion() 
     { 
      WebClient client = new WebClient(); 

      string urlPattern = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.xchange%20where%20pair%20in%20(%22USDKWD,EURKWD,GBPKWD,AEDKWD,ZARKWD%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys"; 

      var jsonResult = client.DownloadString(urlPattern); 
      dynamic results = JsonConvert.DeserializeObject<dynamic>(jsonResult); 
      var rates = results.rate; 
      List<CurrencyJSON> currencies = new List<CurrencyJSON>(); 
      using (var db = new ERPContext()) 
      { 

       foreach (var rate in rates) 
       { 
        var currencyJson = new CurrencyJSON();//POCO 
        currencyJson.Bid = rate.Bid; 
        currencyJson.Name = rate.Name; 

        currencies.Add(currencyJson); 
       } 

       db.Configuration.AutoDetectChangesEnabled = false; 
       db.Configuration.ValidateOnSaveEnabled = false; 

       db.CurrencyJson.ToList().AddRange(currencies); 
       db.SaveChanges(); 
      } 
     } 
    } 

私はwron何をやっている実行しましたg? 助けをよろしくお願いいたします。ありがとうございます。 すでに似たような質問を確認しましたが、hereが掲載されましたが、助けになりませんでした。

+1

Hangfireはデフォルトでインターフェイスをサポートしていないようで、インターフェイスをタイプにマップするためにIoCライブラリを必要とするようです。 https://discuss.hangfire.io/t/architecture-questions/1167/2とhttps://discuss.hangfire.io/t/cannot-create-an-instance-of-an-interface/28を参照してください。 – Diado

答えて

0

@Diadoがコメントに指摘しているように、デフォルトのサポートがないため、Interfaceを使用している場合は、IoCが必要です。または、インターフェイスの代わりにクラスを直接使用することもできます。

https://github.com/devmondo/HangFire.SimpleInjectorは、私が使用したIoCインジェクタの1つです。

関連する問題