Tôi có lớp "Hành động" trừu tượng, có các loại ActionAppointment, ActionCall, ActionEmail và ActionLetter. Tôi đang cố gắng viết một hàm sẽ làm khô lớp dịch vụ của chúng tôi, vì vậy chúng tôi không viết các cuộc gọi CRUD 5 lần nữa.Mẫu C# cho mã cụ thể lớp trừu tượng
tôi có trong lớp dịch vụ của chúng tôi một số logic cập nhật (rất nhiều mã khác bị loại bỏ cho ngắn gọn):.
private IServiceResponse UpdateAction<T>(T action, string originalActionStatus) where T : Action
{
if (action.GetType() == typeof(Action))
{
_actionRepository.Update(action);
}
else if (action.GetType() == typeof(ActionAppointment))
{
_actionAppointmentRepository.Update(action as ActionAppointment);
}
else if (action.GetType() == typeof(ActionCall))
{
_actionCallRepository.Update(action as ActionCall);
}
else if (action.GetType() == typeof(ActionEmail))
{
_actionEmailRepository.Update(action as ActionEmail);
}
else if (action.GetType() == typeof(ActionLetter))
{
_actionLetterRepository.Update(action as ActionLetter);
}
}
Thật không may, cách kho của chúng tôi được thiết lập, tôi phải sử dụng các kho đặc biệt được đặt tên (tức là tôi không thể cập nhật ActionLetter thông qua _actionRepository ngay cả khi nó xuất phát từ Hành động)
Tôi đã đọc trên các mẫu khác nhau và có vẻ giống như một Mẫu Nhà máy, nhưng tôi không thể thấy cách làm cho nó hoạt động.
Tôi có thiếu gì đó ngu ngốc không?
Bạn có thể xem xét mẫu * Visitor * (http://en.wikipedia.org/wiki/Visitor_pattern). –
Có một mẫu nhà máy là một giải pháp. Kho lưu trữ của bạn phải có lớp cơ sở chung hoặc triển khai giao diện. Tất cả chúng đều phải có phương thức Update chấp nhận đối tượng được gõ là Action. Nhà máy chấp nhận kiểu như một tham số (trong bất kỳ hình thức, tên, loại, enum nếu có sẵn) và trả về kho lưu trữ chính xác. Đó là khá nhiều đó. Có một điểm cụ thể của sự nhầm lẫn về cách thực hiện Nhà máy? – Sisyphus
Tôi không chắc chắn cách triển khai mẫu nhà máy cho mẫu này, vì IRepository là chung dựa trên từng đối tượng mô hình miền. – mandreko