2016-10-24 4 views
0

Я хотел бы, чтобы мой контроллер реализовал мой интерфейс данных, который возвращает пользовательские объекты. Все объекты сериализуемы и украшены атрибутами JSON. Поэтому я хотел бы, чтобы мой метод контроллера просто что:Реализация интерфейса данных в ASP.NET MVC Controller и возврат 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) }; 
    }  
} 
+0

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

+0

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

+0

Возможно, вы можете ввести унаследованный интерфейс, например 'IMyInterfaceMVC', где вы можете' new' методы возвращать 'JsonResult'. Когда будет добавлен новый метод, ваш контроллер будет иметь ошибку, и когда вы добавите метод действия, появится ошибка с типом возвращаемого значения, поэтому вам также придется обновлять 'IMyInterfaceMVC'. Вы можете реализовать интерфейс интерфейса неявно и интерфейс '... MVC' неявно. Вероятно. Не тестировали, просто идея. –

Смежные вопросы