2011-12-14 2 views
0

저는 Data, Service 및 Web 프로젝트가 3 개있는 asp.net mvc3 솔루션에서 작업하고 있습니다. 나는 서비스 레이어를 가능한 많이 추상화하기 위해 인터페이스를 사용 해왔다. 그래서 웹은 실제 도메인 모델이 유지되는 데이터가 아니라 서비스 레이어에 대해서만 알고있다. 웹 프로젝트는 뷰 모델을 사용하고 서비스 모델에 대한 단순한 매개 변수를 도메인 객체와 비교하여 전달합니다. 예를 들어 사용자를 만들려면 다음과 같은 인터페이스를 사용합니다.asp.net mvc는 인덱스 또는 직접 도메인 객체에 대한 viewmodels를 사용합니까?

public interface IUserService 
{ 
    void CreateUser(string userName, string firstName, string lastName....); 
} 

하지만 어떤 형태의 도메인 객체를 반환해야 할 것 GetUsers 같은 잠시 뭔가 그것에 대해 생각이 날 웹 프로젝트의 데이터 참조를 추가 할 필요 후.

public interface IUserService 
{ 
    void CreateUser(string userName, string firstName, string lastName....); 
    **IEnumerable<User>** GetUsers(); 
} 

그래서 나는 두 가지 선택이 생각 중 모든 프로젝트는 다음을 참조하여이 있거나 가능성이 웹 프로젝트에 대한 데이터 참조를 추가 자신의 프로젝트에 내 도메인 오브젝트를 파괴. 첫 번째 옵션이 최고라고 생각하지만 다른 옵션이 있는지 궁금합니다. 감사합니다

+0

내 대답을 확인하십시오. http://stackoverflow.com/questions/2597363/asp-net-mvc-should-a-view-model-encapsulate-domain-model/2597497#2597497 – Ryan

답변

2

: 내가 서비스 나 데이터 계층은 항상 일반적인 입력 된 데이터와 결과 형식을 반환 보내고 있습니다

// MyCompany.Data Project 
public interface IUserService 
{ 
    IUserServiceResult<IUser> CreateUser(IUser User); 
    IUserServiceResult<IEnumerable<IUser>> GetUsers(); 
} 

public interface IUserServiceResult<T> 
{ 
    bool IsSuccessful { get; } 
    string UserErrorMessage { get; } 
    T Data { get; } 
} 

public interface IUser 
{ // Some Getter Properties 
} 

// MyCompany.Service 
public class UserService : IUserService 
{ 
    public UserServiceResult<User> CreateUser(IUser User) 
    { 
     var result = new UserServiceResult<User>(); 

     if (User == null) 
     { 
     // log the error AND 
     result.UserErrorMessage = "User information was not valid."; 

     // or 
     throw new ArgumentNullException("User"); 
     } 

     // example only 
     result.IsSuccessful = 
     (Context.Users.FirstOrDefault(x => x.Email == User.Email) == null) 

     if (result.IsSuccessful) 
     { 
      User newUser; 
      // create user... 
      result.Data = newUser; 
     } 

     return result; 
    } 
    public IUserServiceResult<IEnumerable<IUser>> GetUsers() 
    { 
    // Similar to above, can check for authentication 
    // Maybe return IsSuccessful = false, 
    // UserErrorMessage = "Requires administrative privileges". 

    // or result.Data = new List<User>(); 
    } 
} 

public class UserServiceResult<T> : IUserServiceResult<T> 
{ 
    bool IsSuccessful { get; set; } 
    string UserErrorMessage { get; set; } 
    T Data { get; set; } 
} 

public class User : IUser { } // 

. 특히 jQuery로 다시 전달할 때 도움이된다.

+0

감사합니다. 좋은 생각. 나는 그것을 밖으로 시도 할 것이다. – NullReference

+0

Waaay 너무 많은 인터페이스. 또한 자체 오류 인터페이스를 작성하는 대신 예외를 발생 시키십시오. 스택 트레이스는 디버거의 친구입니다. – Ryan

1

하나의 방법은 두 개의 별도 프로젝트, 하나는 데이터 클래스, 하나는 모델/ViewModels에 대한 것입니다.

  1. 컨트롤러 수동으로 UserModel에 사용자를 매핑하거나 컨트롤러에 http://automapper.codeplex.com/
  2. 반환에게는 IEnumerable을 사용
  3. 서비스 저장소
  4. 중 하나를 사용하여 데이터 객체 (IE 사용자를) 검색 서비스에 요청을 .

이제 컨트롤러는 사용자 대신 UserModel과 함께 작동합니다. 귀하의 웹 응용 프로그램이 귀하의 데이터 클래스를 망쳐 놓지 않게합니다.

서비스 용 인터페이스를 모델 프로젝트에 배치하고 나머지 서비스 사용자는 모델 및 인터페이스에 액세스 할 수 있습니다. 나는 것 대신 User를 반환