2017-10-03 16 views
1

C#のUnityとの依存関係注入に関するチュートリアルに従っています。チュートリアルでは、コンセプトを実証するための例としてリポジトリクラスを使用しました。サンプルプロジェクトの1つにそれを適用しようとすると、私は継承の問題に遭遇しました。だから私は持っているC#の継承クラスと派生クラス(DIケース)

public interface IRepository<T> where T : class 
{ 
    List<T> GetAll(); 

    T Get(int id); 

    void Add(T entity); 

    void SaveChanges(); 
} 

public class Repository<T> : IRepository<T> where T : class 
{ 
    private CoffeeMachineDbContext context = null; 

    protected virtual DbSet<T> DbSet { get; set; } 

    public Repository() 
    { 
     context = new CoffeeMachineDbContext(); 
     DbSet = context.Set<T>(); 
    } 

    public Repository(CoffeeMachineDbContext context) 
    { 
     this.context = context; 
    } 

    public virtual List<T> GetAll() 
    { 
     return DbSet.ToList(); 
    } 

    public virtual T Get(int id) 
    { 
     return DbSet.Find(id); 
    } 

    public virtual void Add(T entity) 
    { 
     DbSet.Add(entity); 
    } 

    public void SaveChanges() 
    { 
     context.SaveChanges(); 
    } 
} 

リポジトリクラスは、インターフェイスと一般的な方法を実装しています。インターフェースを宣言

public interface IClientRepository : IRepository<Client> 
{ 
    Order GetLastOrder(int id); 
} 

ていることに注意してください:それは説明した(または私はそれを理解できるように、少なくとも)、私は次のようにIRepositoryから継承する新しいインターフェイスの名前IClientRepositoryを作成したとして は今、依存性注入を適用できるようにするにはそれはクライアントのコンテキストに固有の新しいメソッドです。

最後に、IClientRepositoryインタフェースの実装は次のとおりです。彼らは他のすべての間で共通しているので、私はIRepositoryメソッドを実装する必要はありません

public class ClientRepository : Repository<Client>, IClientRepository 
{ 
    /// <summary> 
    /// Gets the client's last order 
    /// </summary> 
    /// <param name="id"></param> 
    /// <returns></returns> 
    public Order GetLastOrder(int id) 
    { 
     Order lastOrder = null; 
     Client client = DbSet.Find(id); 
     if (client != null) 
     { 
      lastOrder = client.Orders.OrderByDescending(o => o.DateCreated).FirstOrDefault(); 
     } 

     return lastOrder; 
    } 

私が直面してるの問題は、私は次のように統一コンテナタイプを登録しようとしているとき:

container.RegisterType<IClientRepository, ClientRepository>(new HierarchicalLifetimeManager()); 

私が手に、次のエラー

型「CoffeeMachine.Models .Repositories.ClientRepository 'は、ジェネリック型またはメソッド' UnityContainerExtensions.RegisterType(IUnityContainer、LifetimeManager、params InjectionMember []) 'の型パラメータ' TTo 'として使用できません。 'CoffeeMachine.Models.Repositories.ClientRepository'から 'CoffeeMachine.Models.Repositories.IClientRepository'への暗黙的な参照変換はありません。

誰も私がここで間違っていたことを知っていますか?

+6

なぜあなたのClientRepositoryはIClientRepositoryを実装していませんか? – mason

+0

ClientRepositoryがGetAll()、Get(int)などを実装していないというエラーが表示されるので、 –

+0

基本クラスが必要です。public class ClientRepository:Repository 、IClientRepository { ...} ' –

答えて

1

クラスが実際にIClientRepositoryを実装していないため、このエラーが発生します。

クラスが実際にそのインターフェイスを実装している場合のみ、インスタンスをインターフェイスにキャストできます。

+0

これは私が最初に考えたものです。しかし、一度それを行うとエラーが表示されます.ClientRepositoryはGetAll()、Get(int)などを実装していません。 –

関連する問題