2017-12-27 13 views
-1

ジェネリックリポジトリ投げ、次のエラーのためにタイプのサービスを解決できません。 nvalidOperationException: 'Controllers.HomeController'をアクティブにしようとしているときに、タイプ 'Core.Repository.MongoDb.MongoRepository`1 [Controllers.HomeController + TestUser]'のサービスを解決できません。と、InvalidOperationException:一般的なリポジトリ

以下は、依存性注入を実行しようとしている間にエラーを投げているジェネリックリポジトリです。

 public interface IEntity 
     { 

      string Id { get; set; } 

      DateTime CreatedDate { get; set; } 

     } 

    public interface IRepository<T> where T: IEntity 
    { 
     /// <summary> 
     /// Inserts the specified entity. 
     /// </summary> 
     /// <param name="entity">The entity.</param> 
     /// <param name="cancellationToken">The cancellation token.</param> 
     /// <returns></returns> 
     Task<T> Insert(T entity, InsertOneOptions options, CancellationToken cancellationToken = default(CancellationToken)); 
} 

public class MongoRepository<T> : IRepository<T> where T : IEntity 
{ 
      .... 
    } 


public class Entity: IEntity 
{ 
    public string Id { get; set; } 

    public DateTime CreatedDate { get; set; } 
    .... 
} 


public class HomeController : Controller 
{ 
    private IRepository<TestUser> _repository; 

    public class TestUser : Entity 
    { 
     public string Name { get; set; } 
    } 
    public HomeController(MongoRepository<TestUser> repository) 
    { 
       this._repository = repository; 

    } 

    public IActionResult Index() 
    { 
     var result=_repository.GetAll(); 

     return View(result); 
    } 
} 

Startup.csクラスはこのようなサービスを登録しました。

services.AddScoped(typeof(IRepository<>), typeof(MongoRepository<>)); 

基本的には、それ自体がエラーを投げる前にホームコントローラに来ることさえありません。 DIなしでインスタンス化しようとすると、リポジトリはなぜDIで失敗するのかわかりません。

+1

(あなたはコンストラクタで使用)実際のエンティティtestuserとは、エンティティからのみ継承し、IEntity インタフェースを実装していない間、あなたのIRepository は、IEntity 期待しています。問題ありますか? – Jure

+1

あなたの質問を編集して、コードが正しくフォーマットされるようにしてください。 –

+0

@Jure EntityクラスはIEntityインターフェイスを実装しています。私はEntityから他のクラスを派生していますが、なぜDIで解決できないのか分かりません。 – dpdp

答えて

0

あなたは

MongoRepository<TestUser> repository 

を注入しているそれとも、インターフェイスを使用する必要があり、それはDIの原則です。

IRepository<TestUser> repository 

とIT意志作品で、あなたのコントローラのコンストラクタで交換してください。

+0

基本的にはデフォルトのコンストラクタが削除されてしまい、誤ってMongoRepositoryオブジェクトがDIプロセスで作成されていませんでした – dpdp

+0

あなたの問題は何か分かりません。 – Coemgen

関連する問題