Абстрактный параметр параметра базового контроллера MVC для привязки модели - PullRequest
2 голосов
/ 30 октября 2010

Для простоты, допустим, у меня есть следующий класс абстрактных базовых контроллеров:

public abstract class RESTController : Controller
{      
    public abstract JsonResult List();
    public abstract JsonResult Get(Guid id);
    public abstract JsonResult Create(object obj);
    public abstract JsonResult Update(object obj);
    public abstract JsonResult Delete(Guid Id);
}

Для методов Create & Update я хочу переопределить не только метод, но и тип параметра.

Обычно я бы использовал дженерики примерно так:

public abstract JsonResult Create<T>(T obj);

Однако это действие MVC, и нет возможности указать параметры типа.

Какие у меня варианты? Если я оставлю это как (object obj), будет ли корректно работать связыватель модели MVC?

var model = obj as MyViewModel;

Это не очень чисто в любом случае. Любая помощь будет оценена.

Ответы [ 2 ]

8 голосов
/ 30 октября 2010

Как насчет чего-то среди строк:

public abstract class RESTController<T> : Controller
{      
    public abstract JsonResult List();
    public abstract JsonResult Get(Guid id);
    public abstract JsonResult Create(T obj);
    public abstract JsonResult Update(T obj);
    public abstract JsonResult Delete(Guid Id);
}

и при переопределении:

public FooController: RESTController<Foo>
{
    ...
    public override JsonResult Create(Foo obj)
    {
        throw new NotImplementedException();
    }
    ...
}
0 голосов
/ 30 ноября 2015

Если вы хотите что-то более конкретное, вы можете попробовать использовать что-то вроде следующего. Я использую Onion Architecture и Repository Pattern, с IoC и DI. IEntity просто предоставляет доступ к полю Id объекта ( Я предполагаю, что Entity Framework Code сначала здесь, с Entity.Id в качестве первичного ключа для каждого объекта, тогда как EntityId будет обозначать внешний ключ для другого стол. ).

Действия являются виртуальными, чтобы позволить производным классам переопределять их при необходимости, и хранилище установлено на защищенный, так что производный класс также может извлекать данные из хранилища для объекта. Это работает с базовым репозиторием CRUD, но может быть заменено агрегатом, чтобы обеспечить больше функциональности.

using System;
using System.Web.Mvc;
using MySolution.Core.Interfaces.EntityFramework;
using MySolution.Core.Interfaces.Repositories;

namespace MySolution.Ux.Web.Site.Primitives
{
    /// <summary>
    ///     Provides mechanisms for performing CRUD operations on entities within a RESTful environment.
    /// </summary>
    /// <typeparam name="TEntity">The type of the entity.</typeparam>
    public abstract class CrudController<TEntity> : Controller 
        where TEntity : class, IEntity, new()
    {
        /// <summary>
        ///     The repository to use for CRUD operations on the entity. Derived classes
        ///     also have access to this repository so that the virtual actions can be
        ///     overridden with custom implementations.
        /// </summary>
        protected readonly IRepository<TEntity> Repository;

        /// <summary>
        ///     Initialises a new instance of the <see cref="CrudController{TEntity}"/> class.
        /// </summary>
        /// <param name="repository">The repository.</param>
        protected CrudController(IRepository<TEntity> repository)
        {
            // Instantiate the controller's repository.
            Repository = repository;
        }

        /// <summary>
        ///     Lists this specified entities within the data store.
        /// </summary>
        /// <returns>A JSON formatted list of the entities retrieved.</returns>
        [HttpGet]
        public virtual JsonResult List()
        {
            try
            {
                return Json(Repository.GetAll(), JsonRequestBehavior.AllowGet);
            }
            catch (Exception e)
            {
                return Json(e.Message, JsonRequestBehavior.AllowGet);
            }

        }

        /// <summary>
        ///     Gets a specific entity within the data store.
        /// </summary>
        /// <returns>A JSON formatted version of the entity retrieved.</returns>
        [HttpGet]
        public virtual JsonResult Get(Guid id)
        {
            try
            {
                return Json(Repository.Get(id), JsonRequestBehavior.AllowGet);
            }
            catch (Exception e)
            {
                // An error has occured. Handle the exceptions as needed and return feedback via JSON.
                return Json(e.Message, JsonRequestBehavior.AllowGet);
            }

        }

        /// <summary>
        ///     Creates a specific entity within the data store.
        /// </summary>
        /// <returns>A JSON formatted version of the entity created.</returns>
        [HttpPost]
        public virtual JsonResult Create(TEntity entity)
        {
            try
            {
                Repository.Add(entity);
                Repository.Save();
                return Json(entity);
            }
            catch (Exception e)
            {
                // An error has occured. Handle the exceptions as needed and return feedback via JSON.
                return Json(e.Message);
            }

        }

        /// <summary>
        ///     Updates a specific entity within the data store.
        /// </summary>
        /// <returns>A JSON formatted version of the entity updated.</returns>
        [HttpPut]
        public virtual JsonResult Update(TEntity entity)
        {
            try
            {
                Repository.Update(entity);
                Repository.Save();
                return Json(entity);
            }
            catch (Exception e)
            {
                // An error has occured. Handle the exceptions as needed and return feedback via JSON.
                return Json(e.Message);
            }

        }

        /// <summary>
        ///     Deletes a specific entity from the data store.
        /// </summary>
        /// <returns>A JSON formatted version of the entity deleted.</returns>
        [HttpDelete]
        public virtual JsonResult Delete(Guid id)
        {
            try
            {
                var entity = Repository.Get(id);
                Repository.Remove(entity);
                Repository.Save();
                return Json(entity);
            }
            catch (Exception e)
            {
                // An error has occured. Handle the exceptions as needed and return feedback via JSON.
                return Json(e.Message);
            }

        }
    }
}
...