2016-03-03 12 views
6

Tôi đang cố triển khai phương thức chung GetById(T id) sẽ phục vụ cho các loại có thể có các loại ID khác nhau. Trong ví dụ của tôi, tôi có một pháp nhân có ID loại int và một loại string.Cách thực hiện chung GetById() trong đó Id có thể có nhiều loại khác nhau

Tuy nhiên, tôi cứ bị lỗi và tôi không có ý tưởng tại sao:

Các loại 'int' phải là một loại tài liệu tham khảo để sử dụng nó như là tham số 'TID' trong các loại hình chung của phương pháp IEntity

Entity Interface:

để phục vụ cho các mô hình tên miền của tôi có thể có của Id loại int hay string.

public interface IEntity<TId> where TId : class 
{ 
    TId Id { get; set; } 
} 

Entity Triển khai:

public class EntityOne : IEntity<int> 
{ 
    public int Id { get; set; } 

    // Other model properties... 
} 

public class EntityTwo : IEntity<string> 
{ 
    public string Id { get; set; } 

    // Other model properties... 
} 

Generic Repository Interface:

public interface IRepository<TEntity, TId> where TEntity : class, IEntity<TId> 
{ 
    TEntity GetById(TId id); 
} 

Generic Thực hiện Repository:

public abstract class Repository<TEntity, TId> : IRepository<TEntity, TId> 
    where TEntity : class, IEntity<TId> 
    where TId : class 
{ 
    // Context setup... 

    public virtual TEntity GetById(TId id) 
    { 
     return context.Set<TEntity>().SingleOrDefault(x => x.Id == id); 
    } 
} 

Triển khai Repository:

public class EntityOneRepository : Repository<EntityOne, int> 
    { 
     // Initialise... 
    } 

    public class EntityTwoRepository : Repository<EntityTwo, string> 
    { 
     // Initialise... 
    } 
+6

Tại sao các bạn hạn chế 'TId' cho 'loại class'? Điều đó sẽ không làm việc với 'int' (thông báo lỗi làm cho điều đó khá rõ ràng). 'class' có nghĩa là" kiểu tham chiếu "trong các ràng buộc chung. –

Trả lời

2

Bạn nên loại bỏ các hạn chế về TID từ Repository lớp học của bạn

public abstract class Repository<TEntity, TId> : IRepository<TEntity, TId> 
where TEntity : class, IEntity<TId> 
{ 
    public virtual TEntity GetById(TId id) 
    { 
     return context.Set<TEntity>().Find(id); 
    } 
} 
+0

Đề xuất này giải quyết lỗi loại tham chiếu, tuy nhiên, tôi hiện đang nhận được toán tử == không thể áp dụng cho toán hạng loại lỗi TId và TId' khi cố gắng thực hiện khớp theo Id – Tomuke

+0

Biến nó hoạt động tốt nếu tôi sử dụng ' .Find (id) 'thay vì' .SingleOrDefault (x => x.Id == id) '. Tôi hy vọng nó đang làm chính xác điều tương tự đằng sau phương pháp này mặc dù, do đó, không chắc chắn tại sao '.Find()' là hợp lệ. – Tomuke

+0

nó không hoạt động cho tôi. hiển thị lỗi –

1

Đối với câu hỏi của bạn:
Tôi cố gắng để thực hiện một generic GetById (T id) phương pháp này sẽ phục vụ cho các loại có thể có các loại ID khác nhau. Trong ví dụ của tôi, tôi có một thực thể có một ID kiểu int và một trong các loại chuỗi.

public virtual TEntity GetById<TId>(TId id) 
    { 
     return context.Set<TEntity>().SingleOrDefault(x => x.Id == id); 
    } 

Đối với thông số chung chung, chỉ cần đảm một phương pháp chung chung như trên

2
public interface IEntity<TId> where TId : class 
{ 
    TId Id { get; set; } 
} 

Các where TId : class hạn chế đòi hỏi mỗi thực hiện để có một Id mà xuất phát từ đối tượng đó là không đúng đối với các loại giá trị như int .

Thats những gì được thông báo lỗi nói với bạn: The type 'int' must be a reference type in order to use it as parameter 'TId' in the generic type of method IEntity

Chỉ cần loại bỏ các contraint từ IEntity<TId>

Các vấn đề liên quan