Я не могу придумать «лучший» способ справиться со следующей ситуацией - в основном, у меня есть набор хранимых объектов, которые наследуются от базового типа, и я хотел бы иметь возможность получить один из хранилища, найти его подтип (возможно, через «if (x is y)»), а затем действуйте соответствующим образом - некоторые используют общую реализацию, другие - с выделенной логикой и представлениями.
Полагаю, [урезано] это будет выглядеть примерно так:
/vehicle/details/1234
- Views
- Vehicle
- Details.aspx
abstract class Vehicle{
public int ID{ get; }
}
class Motorbike : Vehicle{
//whatever
}
class Car : Vehicle{
public int NoOfDoors{ get; }
}
class VehicleController : Controller{
VehicleRepository _vehicleRepository; //injected, etc
public ActionResult Details(int id){
var vehicle = _vehicleRepository.Get(id);
//we can now figure out what subtype the vehicle is
//and can respond accordingly
}
}
Теперь, если бы мы не беспокоились о будущем расширении и обслуживании и тому подобном, мы могли бы пойти по темному пути и реализовать что-то вроде следующего - что бы функционировало просто отлично, но, без сомнения, было бы [придет] абсолютным кошмар.
- Views
- Vehicle
- Details.aspx
- CarDetails.aspx
public ActionResult Details(int id){
var vehicle = _vehicleRepository.Get(id);
return (vehicle is Car) ? DetailsView((Car)vehicle) : DetailsView(vehicle);
}
private ActionResult DetailsView(Car car){
var crashTestResults = GetCrashTestResults(car);
var carData = new CarDetailsViewData(car, crashTestResults);
return View("CarDetails", carData);
}
private ActionResult DetailsView(Vehicle vehicle){
var vehicleData = new VehicleDetailsViewData(car, crashTestResults);
return View("Details", vehicleData);
}
Другим механизмом было бы использование подпапок на уровне представления, что обеспечивало бы разумную чистоту кода, но не помогало в моей ситуации, так как я тоже хочу метод настраиваемого действия ...
- Views
- Vehicle
- Car
- Details.aspx
- Motorbike
- Details.aspx
public ActionResult Details(int id){
var vehicle = _vehicleRepository.Get(id);
return View(vehicle.GetType().Name + "\Details", vehicle);
}
В идеале решением было бы использование базового контроллера и выделенных контроллеров с переопределениями там, где это необходимо - но, поскольку нам нужно извлечь объект из хранилища, прежде чем мы сможем определить этот идеальный контроллер, я не могу понять, как заставить это работать. ..
Мои нынешние идеи обычно сводятся к первому препятствию, когда «VehicleController» слишком много знает о том, что такое переопределения подтипов, поэтому любые идеи будут оценены.
Приветствие.