asp.net mvc使用viewmodels索引或直接域对象?

时间:2011-12-14 21:59:21

标签: asp.net-mvc entity-framework repository-pattern

我正在开发一个asp.net mvc3解决方案,它有3个项目Data,Service和Web。我一直在使用接口来尽可能地抽象服务层,因此web只知道服务层,而不是真正的域模型所在的数据。 Web项目使用视图模型,只是将事物作为分解参数与域对象传递给服务模型。例如,创建用户我会使用这样的界面。

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

但是在考虑了GetUsers之类的东西后,我需要返回某种类型的域对象,这需要我在web项目中添加数据引用。

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

所以我认为我有两个选择,要么将我的域对象分解为自己的项目,然后所有项目都引用或可能将数据引用添加到Web项目中。我认为第一种选择是最好的,但我很好奇是否有其他选择。谢谢

2 个答案:

答案 0 :(得分:2)

而不是返回User,我会:

// 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时特别有用。

答案 1 :(得分:1)

一种方法是拥有两个独立的项目,一个用于数据类,一个用于Models / ViewModel。

  1. Controller向服务发出请求
  2. 服务使用您的存储库检索数据对象(I.E.用户)
  3. 手动将用户映射到UserModel或使用http://automapper.codeplex.com/
  4. 将IEnumerable返回给控制器。
  5. 现在控制器使用UserModel而不是User。这使您的Web应用程序不会弄乱您的数据类。

    您还可以将服务的接口放入模型项目中,并允许Rest服务的使用者访问模型和接口。