Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc asp.net mvc是否将viewmodels用于索引或直接域对象?_Asp.net Mvc_Entity Framework_Repository Pattern - Fatal编程技术网

Asp.net mvc asp.net mvc是否将viewmodels用于索引或直接域对象?

Asp.net mvc asp.net mvc是否将viewmodels用于索引或直接域对象?,asp.net-mvc,entity-framework,repository-pattern,Asp.net Mvc,Entity Framework,Repository Pattern,我正在开发一个asp.net mvc3解决方案,它有三个项目:数据、服务和Web。我一直在使用接口尽可能地抽象服务层,以便web只知道服务层,而不知道保存真正域模型的数据。web项目使用视图模型,并简单地将内容作为与域对象相对应的参数传递给服务模型。例如,创建一个用户,我会使用这样的界面 public interface IUserService { void CreateUser(string userName, string firstName, string lastName...

我正在开发一个asp.net mvc3解决方案,它有三个项目:数据、服务和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();
}
公共接口IUserService
{
void CreateUser(字符串用户名、字符串名、字符串名…);
**IEnumerable**GetUsers();
}

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

一种方法是有两个独立的项目,一个用于数据类,另一个用于模型/视图模型

  • 控制器向服务发出请求
  • 服务使用您的存储库检索数据对象(即用户)
  • 手动将用户映射到UserModel或使用
  • 将IEnumerable返回给控制器
  • 现在控制器与UserModel而不是用户一起工作。这样可以防止web应用程序与数据类发生冲突


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

    一种方法是使用两个单独的项目,一个用于您的数据类,另一个用于您的模型/视图模型

  • 控制器向服务发出请求
  • 服务使用您的存储库检索数据对象(即用户)
  • 手动将用户映射到UserModel或使用
  • 将IEnumerable返回给控制器
  • 现在控制器与UserModel而不是用户一起工作。这样可以防止web应用程序与数据类发生冲突


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

    我将:

    // 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 { }  //
    
    //MyCompany.Data项目
    公共接口服务
    { 
    IUserServiceResult CreateUser(IUser用户);
    IUserServiceResult GetUsers();
    } 
    公共接口IUserServiceResult
    {
    布尔问题成功{get;}
    字符串UserErrorMessage{get;}
    T数据{get;}
    }
    公共接口IUser
    {//一些Getter属性
    }
    //我的公司。服务
    公共类UserService:IUserService
    {
    公共UserServiceResult CreateUser(IUser用户)
    {  
    var result=新的UserServiceResult();
    if(User==null)
    {
    //记录错误并
    result.UserErrorMessage=“用户信息无效。”;
    //或
    抛出新的ArgumentNullException(“用户”);
    }
    //仅举个例子
    result.IsSuccessful=
    (Context.Users.FirstOrDefault(x=>x.Email==User.Email)==null)
    如果(结果:IsSuccessful)
    {
    用户newUser;
    //创建用户。。。
    结果。数据=新用户;
    }
    返回结果;
    }
    公共IUserServiceResult GetUsers()
    {
    //与上面类似,您可以检查身份验证
    //可能返回IsSuccessful=false,
    //UserErrorMessage=“需要管理权限”。
    //或结果。数据=新列表();
    }
    }
    公共类UserServiceResult:IUserServiceResult
    {
    bool issusccessful{get;set;}
    字符串UserErrorMessage{get;set;}
    T数据{get;set;}
    }
    公共类用户:IUser{}//
    

    我喜欢让服务或数据层始终返回带有泛型类型数据的结果类型。我发现将其传递回jQuery时特别有用。

    我会:

    // 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 { }  //
    
    //MyCompany.Data项目
    公共接口服务
    { 
    IUserServiceResult CreateUser(IUser用户);
    IUserServiceResult GetUsers();
    } 
    公共接口IUserServiceResult
    {
    布尔问题成功{get;}
    字符串UserErrorMessage{get;}
    T数据{get;}
    }
    公共接口IUser
    {//一些Getter属性
    }
    //我的公司。服务
    公共类UserService:IUserService
    {
    公共UserServiceResult CreateUser(IUser用户)
    {  
    var result=新的UserServiceResult();
    if(User==null)
    {
    //记录错误并
    result.UserErrorMessage=“用户信息无效。”;
    //或
    抛出新的ArgumentNullException(“用户”);
    }
    //仅举个例子
    result.IsSuccessful=
    (Context.Users.FirstOrDefault(x=>x.Email==User.Email)==null)
    如果(结果:IsSuccessful)
    {
    用户newUser;
    //创建用户。。。
    结果。数据=新用户;
    }
    返回结果;
    }
    公共IUserServiceResult GetUsers()
    {
    //与上面类似,您可以检查身份验证
    //可能返回IsSuccessful=false,
    //UserErrorMessage=“需要管理权限”。
    //或结果。数据=新列表();
    }
    }
    公共类UserServiceResult:IUserServiceResult
    {
    bool issusccessful{get;set;}
    字符串UserErrorMessage{get;set;}
    T数据{get;set;}
    }
    公共类用户:IUser{}//
    

    我喜欢让服务或数据层始终返回带有泛型类型数据的结果类型。我发现将其传递回jQuery时特别有用。

    waaa有太多接口。另外,抛出异常,而不是创建自己的错误接口。堆栈跟踪是调试器的朋友。可能有太多接口。另外,抛出异常,而不是创建自己的错误接口。堆栈跟踪是调试器的朋友。请查看我的