2017-07-18 9 views
0

私は、ASP.NET Core MVCプロジェクトのデータアクセスレイヤにできるだけ簡単にキャッシュを実装しようとしています。主な問題は、すべてのページのキャッシュから、一部のページだけを読み込みたくないということです。私はAutofac.Extras.AttributeMetadataパッケージは、ASP.NET MVCのコアASP.NET Core MVCのコントローラの属性に基づいて依存関係を解決する方法

  • でサポートされていないAutofac can deal with resolving dependencies using attributesなく、

    1. を知っ

      [UseCache] 
      public class ControllerA : Controller 
      { 
          public ControllerA(IBuilder builder) 
          { 
           // Should resolve an IBuilder with a CacheService 
          } 
      } 
      
      public class ControllerB : Controller 
      { 
          public ControllerB(IBuilder builder) 
          { 
           // Should resolve an IBuilder with a NullCacheService 
          } 
      } 
      
      public class Builder : IBuilder 
      { 
          public Builder(ICacheService cacheService) 
          { 
           // The type of the resolved ICacheService depends on the UseCache 
           // attribute on any of the object that depends on this IBuilder 
          } 
      } 
      
      public class CacheService : ICacheService 
      { 
          public Object Get(string key, Func<Object> getValue) 
          { 
           // Check if the value is cached against Key and return it if it's not 
           // Obviously needs a lot more here regarding caching timeframes, expiry etc 
          } 
      } 
      
      public class NullCacheService : ICacheService 
      { 
          public Object Get(string key, Func<Object> getValue) 
          { 
           // Don't do anything with key, just do the work in getValue and return it 
          } 
      } 
      
      public class UseCacheAttribute : Attribute 
      { 
      
      } 
      

      :以下の例では、我々が持っているセットアップの種類を説明する必要があります

      サポートされていても、このオブジェクトを含むオブジェクトの属性検出をサポートする方法はわかりません。

    私たちがAutofacまたはデフォルトのIoC implementionに結び付けられていない、新しいのIoCフレームワークを紹介してうれしいです。

    達成しようとしていることはありますか?何がより良いキャッシングソリューションと考えられるでしょうか?

  • +0

    [Autofac.Extras.AttributeMetadata v4.0.1リリースノート](https://github.com/autofac/Autofac.Extras.AttributeMetadata/releases/tag/v4.0.1)には、「Autofac.Features」を使用できます。 AttributeFilters'は.net coreでサポートされています。 – Sakis

    +0

    @Sakisこれは当てはまりますが、私が知る限り自分の属性を使用することはできません。これはAttributedMetadataModule [Autofac.Extras.AttributeMetadata](https://autofac.org/apidocにあります)を登録する必要があります。 /html/D6EFF2D8.htm)、それは.NETコアに移植されません。 –

    答えて

    1

    私は新しいIoCフレームワークを紹介してくれることを嬉しく思っています。私たちはオートファックまたはデフォルトのIoC実装には関係しません。

    私はAutofacとその慣れていないんだけど、私はシンプルインジェクタに精通していますので、私はシンプルなインジェクタと、このような登録を適用する方法をお見せすることができます

    var cache = new CacheService(); 
    container.RegisterConditional(typeof(IBuilder), 
        Lifestyle.Transient.CreateRegistration<Builder>(
         () => new Builder(cache), 
         container), 
        c => c.Consumer.ImplementationType.GetCustomAttribute<UseCacheAttribute>() != null); 
    
    container.RegisterConditional(typeof(IBuilder), 
        Lifestyle.Transient.CreateRegistration<Builder>(
         () => new Builder(new NullCacheService()), 
         container), 
        c => !c.Handled); 
    

    この登録は少し複雑ですBuilderの消費者に基づいてタイプBuilderの依存関係を変更したいからです。消費者の消費者に至るまでの「チェーン」のルックアップは、特に中間の消費者が過渡的ではないライフスタイルを持っている場合に、誤った動作を起こしやすいため、Simple Injectorがサポートしていないものです。条件付き登録はIBuilderであり、ICacheServiceではありません。

    +0

    これは私たちがそれを実装する方法のようです。私は現時点でこれを検証することができません(ASP.NET Core Identityで動作するSimple Injectorのクロスワイヤメソッドを取得する際に問題が発生しています)が、動作するはずです。ありがとう! )問題があれば返信します; –

    +0

    ドキュメントの相互接続アイデンティティに関する情報があります:https://simpleinjector.org/aspnetcore#working-with-asp-net-core-identity。特にご不明な点がございましたら、[こちら](https://github.com/simpleinjector/SimpleInjector/issues/new)または[こちら](https://stackoverflow.com/questions)の新しい質問を投稿してください。 /尋ねる)。 – Steven

    +0

    そのガイドは非常に裸であり、実際にはクロス配線を説明していません。私はCrossWireの文書でも何も見つけられません。それは重要なのですが、私はカスタム実装を持っているので、本当にすべてのIdentity依存関係を結びつける必要はありません。 –

    関連する問題