Tôi có một giao diện cho một lớp dịch vụ .NET, trong đó, đến lượt nó, sẽ liên lạc với một hệ thống của bên thứ ba thông qua một dịch vụ web. Điều này xử lý một số nhiệm vụ khác nhau liên quan đến chức năng của hệ thống bên thứ ba (nó thực sự là một hệ thống CRM riêng biệt, nhưng khi ngữ cảnh không liên quan, tôi sẽ hoán đổi điều này cho một điều gì đó tầm thường).Generics and convention in C#
Giao diện trông giống như sau:
public interface IMyService
{
CarModel GetCar(string registration);
CarModel AddCar(Car car);
PersonModel GetPerson(string personId);
PersonModel AddPerson(Person person);
}
Bây giờ, mô hình của tôi hiện đang làm việc như sau: Tôi có một BaseResponseModel
, từ đó mỗi SomethingModel
kế thừa. Mỗi SomethingModel
chứa một số đặc tính cơ bản và cũng kết thúc tốt đẹp một Something
- như vậy:
mô hình phản ứng cơ sở
public class BaseResponseModel
{
public List<string> Errors { get; set; }
public bool HasErrors
{
get
{
return (Errors != null && Errors.Count > 0);
}
}
}
mô hình phản ứng cụ thể
public class CarModel : BaseResponseModel
{
public Car Car { get; set; }
}
public class PersonModel : BaseResponseModel
{
public Person Person { get; set; }
}
Ở đây, Car
và Person
chỉ đơn giản chứa một loạt các tài sản công cộng. Sau đó, mỗi phương thức của tôi IMyService
lấy các đối số của nó, định dạng một yêu cầu đến một dịch vụ web .asmx, phân tích phản hồi thành mô hình phản hồi của nó và trả về cho người gọi (một codebehind .ascx).
Tuy nhiên, số lượng các lớp khác nhau ...Model
(chưa kể rằng tất cả chúng đều có tên thuộc tính khác nhau cho các đối tượng được bao bọc của chúng) đang trở nên xấu xí. Tôi của một tâm trí để làm điều gì đó dọc theo dòng trong các cách sau:
public class Car
{
public string Registration { get; set; }
}
public class ServiceResponse<T>
{
public List<string> Errors { get; set; }
public bool HasErrors { ... }
public T Result { get; set; }
}
public interface IMyService
{
ServiceResponse<Car> GetCar(string registration);
ServiceResponse<Car> AddCar(Car car);
ServiceResponse<Person> GetPerson(string id);
ServiceResponse<Person> AddPerson(Person person);
}
điều khiển ASP.NET của tôi sau đó sẽ nhận được ServiceResponse<T>
từ mỗi phương pháp trong IMyService
.
Đây có phải là cách sử dụng "thông thường chính xác" của Generics trong C# không? Hoặc là điều này chỉ đơn giản là che giấu các lỗ hổng kiến trúc sâu hơn với giải pháp của tôi? Có một cái gì đó mất tích từ giải pháp đề xuất của tôi (mặc dù lưu ý rằng việc thực hiện các phương pháp khác nhau Get
và Add
không phải là chung chung như nguyên mẫu làm cho họ có vẻ)?
Tuyên bố từ chối: Xin lỗi nếu câu hỏi này "quá chủ quan", nhưng dường như quá cụ thể là câu hỏi lý thuyết cho Programmers.SE và một chút quá chung chung để trở thành câu hỏi cho CodeReview.SE. Tôi mở để gợi ý về cách cải thiện câu hỏi nếu cần thiết.
Tôi không thấy bất kỳ điều gì sai trái với mẫu. ASP.Net Web API sử dụng một quy ước tương tự cho các thông điệp trả về HTTP mà có thể có một thân của các kiểu khác nhau (xem 'HttpResponseMessage'). –
Có vẻ đúng với tôi. Sử dụng đúng đắn của generics, nơi tốt để sử dụng chúng trong ... yea mà nhìn về bên phải. – Nevyn