2016-12-03 30 views
3

私はAPIを備えたASP.NET Core MVCプロジェクトを持っています。IMemoryCacheコントローラ外部の依存性注入

次に、インフラストラクチャと同じソリューション内にクラスライブラリがあります。私はAPIコントローラで使用する場合は

私のAPIはUserRepository

クラスで、クラスライブラリインフラストラクチャ内のリポジトリメソッドを呼び出します。

private static IMemoryCache _memoryCache; 
public Api(IMemoryCache cache) //Constructor 
{ 
    _memoryCache = cache; 
} 

私はコントローラにキャッシュを使用することができます。 しかし、インフラストラクチャライブラリ内のUserRepositoryクラスで使用する同じ参照をASP.NETに注入したいとします。

私はAPIから呼び出すことができますこの方法では、

UserRepository.GetUser(Id); 

とUserRepositoryクラス内のようなメソッド:

私は UserRepositoryIMemoryCacheを注入するASP.NETを伝えることができますどのように
namespace Infrastructure 
{ 
    public class UserRepository 
    { 
     public static User GetUser(Id) 
     { 
      **//I want to use the Cache Here** 
     } 
    } 
} 

コントローラでない場合でもクラスですか?

+2

はシングルトン(つまり、インスタンスを作成し、(ツーリングメソッドと拡張メソッド以外の)その静的なクラスにご注意くださいDIを経由するのではなく)、Active Recordパターンは** C#の世界では非常に推奨されていません**。それらはすべて、反パターンや悪い習慣とみなされます。 – Tseng

答えて

1

一緒にすべての(静的シングルトン、アクティブレコードパターンと静的クラス)を回避するための具体的な解決策:

public class ApiController : Controller 
{ 
    private readonly UserRepository_userRepository; 
    public ApiController(UserRepository userRepository) 
    { 
     _userRepository = userRepository; 
    } 

    public Task<IActionResult> Get() 
    { 
     // Just access your repository here and get the user 
     var user = _userRepository.GetUser(1); 

     return Ok(user); 
    } 
} 

namespace Infrastructure 
{ 
    public class UserRepository 
    { 
     public readonly IMemoryCache _memoryCache; 

     public UserRepository(IMemoryCache cache) 
     { 
      _memoryCache = cache; 
     } 

     public User GetUser(Id) 
     { 
      // use _memoryCache here 
     } 
    } 
} 

// Startup.cs#ConfigureServices 
services.AddMemoryCache(); 
+0

これは方法ですが、コードを試すとエラーが発生します: タイプ 'Infrastructure.UserR'のサービスを解決できません私はそれを有効にしようとしています... 私はそれのためのインターフェイスを設定する必要がありますか? –

+0

あなたはそれをインタフェースに分割するかどうかに応じて、もちろん「services.AddScoped ()」または「services.AddScoped ()」の起動時に登録する必要があります。あなたはインターフェースに分割することができます。これによりコードのテスト容易性が向上しますが、具体的なクラスを注入することもできますが、単体テストで簡単にモックする能力は失われます – Tseng

2

依存性注入とstaticはうまく一緒に遊ばない。どちらか1つを選択するか、このような困難に終わることがあります。依存性注入コンテナにUserRepositoryを追加し、コンストラクタにIMemoryCacheを追加し、コントローラにリポジトリを注入することをお勧めします。

キーは、Web APIレイヤーだけでなく、アプリケーションのすべてのレイヤーに依存関係注入を実装することです。