Реализация интерфейса данных в ASP.NET Контроллер MVC и возврат JSON

#asp.net-mvc

#asp.net-mvc

Вопрос:

Я хотел бы, чтобы мой контроллер реализовал мой интерфейс данных, который возвращает пользовательские объекты. Все объекты сериализуемы и оформлены атрибутами JSON. Итак, я хотел бы, чтобы мой метод контроллера был просто таким:

   public class MyController : Controller, IMyInterface
  {
        public Foo[] GetFoosByName(string name)
        {
            return new Foo[]{new Foo(name), new Foo(name)}
        }
  }
  

Если я это сделаю, я получу просто ответ «Foo[]». Что я хотел бы получить, так это JSON-сериализованные объекты Foo.
Я могу легко добиться этого, изменив свой ответ на JsonResult:

     public JsonResult GetFoosByName(string name)
    {
        return Json(new Foo[]{new Foo(name), new Foo(name)});
    } 
  

Но тогда я не смогу реализовать IMyInterface таким образом, который легко поддерживается.

Есть идеи о том, как я могу автоматически получить поведение при возврате JsonResult, но при этом сохранить исходные возвращаемые типы?

Ответ №1:

В целом я бы рекомендовал отказаться от такого шаблона. Контроллер MVC в идеале должен быть своего рода самым верхним уровнем, и я думаю, что он не должен реализовывать интерфейсы. Вы должны реализовать такие интерфейсы на уровне сервиса, ниже контроллеров MVC.

Однако, если вы все еще хотите сделать это таким образом, вы можете использовать явную реализацию, подобную этой.

 public class MyController : Controller, IMyInterface
{
    public JsonResult GetFoosByName(string name)
    {
        return Json(((IMyInterface)this).GetFoosByName(name));
    } 

    Foo[] IMyInterface.GetFoosByName(string name)
    {
        return new[] { new Foo(name) };
    }    
}
  

Комментарии:

1. Я согласен, как правило, это не очень хороший шаблон для подражания, у меня особая ситуация 🙂 Что касается вашего предложения, проблема в том, что если завтра в IMyInterface будет добавлен новый метод, человек, поддерживающий код, обновит явную реализацию, но может не осознавать, что следует добавить новый метод JsonResult.

2. У вас не слишком много опций, интерфейс есть интерфейс. На данный момент у меня нет другой идеи.

3. Может быть, вы можете ввести унаследованный интерфейс, подобный тому, IMyInterfaceMVC где вы можете new возвращать методы JsonResult . При добавлении нового метода у вашего контроллера будет ошибка, а при добавлении метода action будет ошибка с типом возвращаемого значения, поэтому вы также будете вынуждены обновить IMyInterfaceMVC . Вы можете реализовать базовый интерфейс исключительно, а ...MVC интерфейс неявно. Возможно. Правда, не тестировал, просто идея.