Как настроить сервис DAL RESTful с EFCodeFirst для приложений MVC? - PullRequest
0 голосов
/ 23 марта 2012

Для приложения MVC3 я хочу создать повторно используемый DAL, к которому обращаются как к сервису, поскольку в будущем он будет использоваться для других проектов.

I создал все сущности с шаблонами TT и EFCodeFirst в отдельном проекте, а затем использовал их в службе RESTful WCF.

Структура этого сервиса, кажется, немного отличается от других сервисов WCF, которые я написал, где я указал RESTful-сигнатуры и дополнительные ответы JSON в качестве декораторов методов в интерфейсе сервиса, то есть:

    [WebGet(UriTemplate = "GetCollection")]
    public List<SampleItem> GetCollection()
    {
        // TODO: Replace the current implementation to return a collection of SampleItem instances
        return new List<SampleItem>() { new SampleItem() { Id = 1, StringValue = "Hello" } };
    }

    [WebInvoke(UriTemplate = "", Method = "POST")]
    public SampleItem Create(SampleItem instance)
    {
        // TODO: Add the new instance of SampleItem to the collection
        throw new NotImplementedException();
    }

Чем отличается эта служба RESTful WCF (созданная с помощью опции RESTful WCF), так это то, что у нее нет интерфейса, и я могу украсить методы службы тем, что мне нужно - это нормально. Сервис будет предоставлять такие методы, как GetUserByID (int id) и т. Д.

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

Спасибо.

Ответы [ 2 ]

0 голосов
/ 24 марта 2012

Предположим, вы хотите раскрыть сущность с именем Person. Служба REST WCF может выглядеть следующим образом:

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]    
public partial class PeopleWebService
{
    [WebGet(UriTemplate = "")]
    public List<Person> GetCollection()
    {
        try
        {
            IPeopleRepository repository = ServiceLocator.GetInstance<IPeopleRepository>();
            var people = repository.GetPeople();
            // use automapper to map entities to Person resource
            var result = Mapper.Map<List<Person>>(people);
            return result;
        }
        catch (Exception exception)
        {
            // do logging etc
            throw new WebFaultException(HttpStatusCode.InternalError);
        }
    }

    /* other methods */
}

Эти сервисы могут также генерироваться T4.

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

Вместо этого я сопоставляю свои сущности с ресурсами. Так что Person может выглядеть следующим образом:

[DataContract]
public class Person
{
    [DataMember]
    public string GivenName { get; set; }

    / * more properties */
}

Возможно, будет полезно использовать T4 для их генерации. Маршрутизация определяется примерно так:

public void Register(RouteCollection routes)
{
    routes.AddService<WorkspaceWebService>("api/v1/people");
}

Чтобы использовать его из проекта ASP.NET MVC, вы можете поделиться своими ресурсами (иначе говоря, Person), как определено выше, как сборка, или вы можете использовать T4 для генерации отдельного набора ресурсов, которые почти одинаковы, но с некоторые дополнительные атрибуты, необходимые для ASP.NET MVC, например, используемые для проверки. Я бы сгенерировал его, потому что мои модели представления ASP.NET MVC обычно эволюционируют независимо от моих ресурсов REST.

Предположим, что ваша служба REST работает на https://api.example.com/, а ваш веб-сайт MVC работает на https://www.example.com/. Ваш PeopleController может выглядеть следующим образом.

public class PeopleController : ControllerBase
{
    [HttpGet]
    public ActionResult Index()
    {
        return View(Get<List<Person>>(new Uri("https://api.example.com/api/v1/people")));
    }

    protected T Get<T>(Uri uri)
    {
        var request = (HttpWebRequest) WebRequest.Create(uri);
        request.Method = "GET";
        request.ContentType = "text/xml";
        using (var response = (HttpWebResponse) request.GetResponse())
        {
            using (var responseStream = response.GetResponseStream())
            {
                Debug.Assert(responseStream != null, "responseStream != null");
                var serializer = new DataContractSerializer(typeof (T));
                return (T) serializer.ReadObject(responseStream);
            }
        }
    }
}

Исходя из вашего вопроса, я предполагаю, что вы хотите использовать JSON. Для этого вам просто нужно установить соответствующий ContentType в запросе и использовать DataContractJsonSerializer, а не DataContractSeralizer. Обратите внимание, что есть некоторые проблемы с датами и DataContractJsonSerializer. Служба отдыха WCF будет автоматически возвращать XML, если тип содержимого - «text / xml», и JSON, если это «application / json».

Обратите внимание, что приложение MVC не знает о базе данных, объектах базы данных или ее контексте базы данных. На самом деле в приложении MVC нет логики базы данных. Вам придется обратить пристальное внимание на безопасность, потому что пользовательский контекст отсутствует в остальных сервисах WCF. Но это совсем другое обсуждение.

0 голосов
/ 23 марта 2012

Если подумать об этом, ваше приложение MVC теперь знает только о вашем сервисе.Понятия не имею, что за этим стоит DAL.В основном, рассматривайте сервис как слой «Постоянство».Итак, теперь ваша модель MVC должна заполнить себя с помощью сервиса.Таким образом, как любое другое приложение заполняет сервис, так ваша модель заполняется сама.Тогда ваши контроллеры будут использовать вашу модель для возврата ваших представлений.

Это не та самая мелочь, которую вы, возможно, ищете, но есть много ресурсов о том, как использовать сервисы RESTful в .NET.Проверьте это и получите те, которые заполняют вашу модель.Тогда представь свою модель.

...