0

MVC3 응용 프로그램의 경우 서비스로 액세스 할 수있는 재사용 가능한 DAL을 만들고 싶습니다.이 서비스는 향후 다른 프로젝트에서 사용됩니다.MVC 응용 프로그램 용 EFCodeFirst를 사용하여 DAL RESTful 서비스를 설정하는 방법은 무엇입니까?

I created all the entities TT 템플릿과 별도의 프로젝트에서 EFCodeFirst를 사용한 다음 RESTful WCF 서비스에서 소모했습니다.

[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(); 
    } 

이 편안하고을 :

이 서비스의 구조는 내가 편안하고 서명과 서비스의 인터페이스 방법 장식, 즉 같은 옵션 JSON 응답을 지정한 내가 쓴 다른 WCF 서비스에서 조금 다른 것 같습니다 RESTful WCF 옵션에서 생성 된 WCF 서비스는 인터페이스가 없다는 점이 다르다. 필요한 서비스 메서드를 꾸밀 수있다. 괜찮다. 이 서비스는 GetUserByID (int id)와 같은 메소드를 공개합니다.

MVC3 애플리케이션에서 이것을 사용하고 싶습니다. 내 서비스에 모델을 연결하는 방법이 명확하지 않아서 일부를 원합니다. 이것을 달성하는 방향.

감사합니다.

답변

0

Person이라는 엔터티를 노출한다고 가정합니다. 로 보일 수 WCF REST 서비스는 다음과 같습니다

[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 5 월 보인다 :

[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 프로젝트에서 소비하기 위해 또는 별도의를 생성하는 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을 설정하고 DataContractSeralizer 대신 DataContractJsonSerializer를 사용해야합니다. 날짜와 DataContractJsonSerializer에는 몇 가지 문제가 있습니다. contenttype이 "text/xml"이고 JSON이 "application/json"이면 WCF rest 서비스는 XML을 자동으로 반환합니다.

MVC 응용 프로그램에는 데이터베이스, 데이터베이스 엔터티 또는 데이터베이스 컨텍스트에 대한 지식이 없습니다. 실제로 MVC 응용 프로그램에는 데이터베이스 논리가 없습니다. 사용자 컨텍스트가 WCF rest 서비스에서 누락되어 보안에주의를 기울여야합니다. 그러나 그것은 완전히 다른 논의입니다.

+0

이것은 지난 주에 발견 한 것을 검증합니다. 이것이 최선의 방법이 아닐 수 있습니다. WCF RESTful 템플릿을 사용할 때 순전히 .Net 응용 프로그램 일지라도 데이터 직렬화를위한 추가 코드를 추가해야합니다. 나중에 내가 깨닫게 된 것은 클라이언트 측 (어떤 방식 으로든)이 DAL에 직접 액세스 할 수 없기 때문입니다. 그러나 미래의 프로젝트는 이러한 유연성을 원할 수 있습니다. 직렬화 프로세스에 대한 훌륭한 설명. 감사. – ElHaix

+0

WCF를 사용하여 [이 예제] (http://blogs.msdn.com/b/pedram/archive/2008/04/21/how-to-consume-rest-)에서 설명한대로 모든 직렬화 작업을 자동으로 수행 할 수 있습니다. services-with-wcf.aspx). 그러나 클라이언트에서 특히 오류 처리와 관련하여 많은 기능이 손실됩니다. – bloudraak

0

MVC 앱은 현재 귀하의 서비스에 대해서만 알 수 있습니다. 그 뒤에 DAL이 있다는 단서가 없습니다. 기본적으로 서비스를 "지속성"계층으로 간주하십시오. 이제 MVC 모델은 서비스를 사용하여 자체 채워야합니다. 따라서 다른 애플리케이션과 마찬가지로 서비스를 채울 수 있습니다. 즉, 모델이 자체로 채워지는 방식입니다. 그러면 컨트롤러가 모델을 사용하여 자신의 의견을 돌려줍니다.

당신이 찾고있는 그다지 쓸데없는 것이 아니지만 .NET에서 RESTful 서비스를 사용하는 방법에 대한 많은 리소스가 있습니다. 그것들을 확인하고 모델을 채우십시오. 그런 다음 모델을 자신의 시야로 가져옵니다.

+0

방금 ​​게시물을 다시 읽었으며 작성한 서비스에 대한 인터페이스가 누락되었음을 알게되었습니다. 그것은 당신의 질문의 핵심이 될 필요가 있습니다. 내 요점은 여전히 ​​질문의 MVC 부분이 아니라 질문의 "내 모델 채우기"부분에 집중해야한다는 것입니다. – Quickhorn