2011-12-14 9 views
0

私は、3つのプロジェクトData、Service、およびWebを持つasp.net mvc3ソリューションに取り組んでいます。私は可能な限りサービスレイヤーを抽象化するためにインターフェイスを使用しています。そのため、Webは実際のドメインモデルが保持されているデータではなく、サービスレイヤーについてしか知りません。 Webプロジェクトでは、ビューモデルを使用して、サービスモデルにサービスオブジェクトを渡します。たとえば、ユーザーの作成のために、このようなインターフェースを使用します。asp.net mvcインデックスまたは直接ドメインオブジェクトのビューモデルを使用しますか?

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

しかし、しばらくの間、それについて、私はいくつかの種類のドメインオブジェクトを返す必要があるだろう、これはWebプロジェクトでのデータ参照を追加する私を必要とするGetUsersのようなものを考えていました。

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

だから、私は2つの選択肢があると思い、どちらかのすべてのプロジェクトが、その後への参照を持っているか、おそらくWebプロジェクトへのデータの参照を追加し、独自のプロジェクトに私のドメインオブジェクトを破ります。私は最初の選択肢が最高だと思うが、他の選択肢があるのならば私は好奇心が強い。ありがとう

+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

1つの方法は、2つの別々のプロジェクト、1つはデータクラス、もう1つはモデル/ ViewModelsにすることです。コントローラは、要求サービスへ

  • サービスは、どちらかを手動でUserModelにユーザーをマッピングまたはコントローラにhttp://automapper.codeplex.com/
  • リターンのIEnumerableを使用
  • リポジトリとのデータオブジェクト(IEユーザー)を取得します

    コントローラは、UserではなくUserModelで動作します。あなたのWebアプリケーションをデータクラスで邪魔しないようにします。

    サービスのインターフェイスをモデルプロジェクトに配置し、Restサービスのコンシューマがモデルとインターフェイスにアクセスできるようにすることもできます。代わりにUserを返す

  • 関連する問題