Я застрял на том, как обращаться с наследованием в моей модели, когда дело доходит до моих контроллеров / представлений.
Базовая модель:
public class Procedure : Entity
{
public Procedure() { }
public int Id { get; set; }
public DateTime ProcedureDate { get; set; }
public ProcedureType Type { get; set; }
}
public ProcedureA : Procedure
{
public double VariableA { get; set; }
public int VariableB { get; set; }
public int Total { get; set; }
}
public ProcedureB : Procedure
{
public int Score { get; set; }
}
и т. Д ... в конечном итоге множество различных процедур.
Итак, я делаю что-то вроде списка всех процедур:
public class ProcedureController : Controller
{
public virtual ActionResult List()
{
IEnumerable<Procedure> procedures = _repository.GetAll();
return View(procedures);
}
}
но сейчас я застрял. По сути, со страницы списка мне нужно указать ссылки на страницы, где можно просмотреть / отредактировать конкретные данные подкласса, и я не уверен, какая из них является лучшей стратегией.
Я подумал, что мог бы добавить действие на MethodController, которое вызвало бы правильный подкласс, динамически выясняя, какой репозиторий использовать, и загрузив подкласс для передачи в представление. Мне пришлось хранить класс в объекте ProtocolType. Мне пришлось создать / реализовать неуниверсальный IRepository, так как я не могу динамически привести к универсальному.
public virtual ActionResult Details(int procedureID)
{
Procedure procedure = _repository.GetById(procedureID, false);
string className = procedure.Type.Class;
Type type = Type.GetType(className, true);
Type repositoryType = typeof (IRepository<>).MakeGenericType(type);
var repository = (IRepository)DependencyRegistrar.Resolve(repositoryType);
Entity procedure = repository.GetById(procedureID, false);
return View(procedure);
}
Я даже не начал разбираться, как представление будет определять, какую часть загружать для отображения деталей подкласса.
Мне интересно, это хороший подход? Это облегчает определение URL. Это упрощает повторное использование кода отображения процедуры.
Другой подход - это специальные контроллеры для каждого подкласса. Это упрощает код контроллера, но также означает множество простых контроллеров для многих подклассов процедур. Можно выработать общие детали процедуры с частичным представлением. Как заставить построить URL, чтобы попасть в контроллер / действие в первую очередь?
Время не думать об этом. Надеюсь, кто-нибудь сможет показать мне свет. Заранее спасибо.