2014-04-18 29 views
1

工作單位,我有以下代碼(我中省略某些領域,使之簡單)Repository模式,與泛型

public interface ICustomer 
{ 

    int Age { get; set; } 

    string Name { get; set; } 
} 

public class Customer : ICustomer 
{ 

    public int Age { get; set; } 


    public string Name { get; set; } 
} 

public interface ICustomerRepository<T> where T : class 
{ 
    IEnumerable<T> GetCustomers(); 

    T GetCustomer(); 

    void AddCustomer(T customer); 
} 

public class CustomerRepository<T> : ICustomerRepository<T> where T:class 
{ 
    public IEnumerable<T> GetCustomers() 
    { 
     return new List<T>(); 
    } 


    public T GetCustomer() 
    { 
     return null; 
    } 


    public void AddCustomer(T customer) 
    { 

    } 
} 


public class UnitOfWork //: IUnitOfWork 
{ 

    public ICustomerRepository<ICustomer> CusRepo 
    { 
     get 
     { 
      return new CustomerRepository<Customer>(); 
      //Error: Error 1 Cannot implicitly convert type 'ConsoleApplication1.CustomerRepository<ConsoleApplication1.Customer>' to 'ConsoleApplication1.ICustomerRepository<ConsoleApplication1.ICustomer>'. An explicit conversion exists (are you missing a cast?)  
     } 

    } 
} 

我得到以下錯誤的的UnitOfWork類。我該如何解決?

.Error 1不能將類型'ConsoleApplication1.CustomerRepository'隱式轉換爲'ConsoleApplication1.ICustomerRepository'。存在明確的轉換(您是否缺少演員?)

我無法使用協變,因爲該參數用於輸入和輸出目的。

回答

2

您應該返回庫如下:

get 
{ 
    return new CustomerRepository<ICustomer>(); 
} 

因爲你ICustomerRepository<T>在進出位置都通用的參數,則無法在這裏使用的差異。要使用方差,可以拆分ICustomerRepository<T>成兩個獨立的接口,像這樣的:

interface IReadRepository<out T> 
{ 
    IEnumerable<T> GetItems(); 
    T GetItem(int id); 
} 

interface IWriteRepository<in T> 
{ 
    void AddItem(T item); 
} 
0

我已經重構你的代碼示例模式。

public class Customer 
{ 
    public int Age { get; set; } 
    public string Name { get; set; } 
} 

public interface IUnitOfWork 
{ 
    int Save(); 
} 

public interface IBaseRepository<TEntity, TKey> : IUnitOfWork where TEntity : class 
{ 
    void Add(TEntity entity); 
    TEntity Find(TKey id); 
    IEnumerable<TEntity> GetAll(); 
} 



public interface ICustomerRepository :IBaseRepository<Customer, int> 
{ 

} 

public class CustomerRepository : ICustomerRepository 
{ 
    public void Add(Customer entity) 
    { 
     throw new System.NotImplementedException(); 
    } 

    public Customer Find(int id) 
    { 
     throw new System.NotImplementedException(); 
    } 

    public IEnumerable<Customer> GetAll() 
    { 
     throw new System.NotImplementedException(); 
    } 

    public int Save() 
    { 
     throw new System.NotImplementedException(); 
    } 
} 


public class UnitOfWork : IUnitOfWork 
{ 
    private ICustomerRepository _customers; 

    public ICustomerRepository Customers 
    { 
     get { return _customers; } 
    } 

    public UnitOfWork() 
    { 
     _customers = new CustomerRepository(); 
    } 

    public int Save() 
    { 
     throw new System.NotImplementedException(); 
    } 
} 
+0

感謝您的迴應,它在一定程度上有所幫助。我的解決方案中有一個小問題。我的接口在一個單獨的項目中,我的具體實現在一個單獨的項目中。所以我不能做下面的公共接口(客戶在不同的項目中)ICustomerRepository:IBaseRepository user3547774