Asp.net mvc asp.net mvc是否将viewmodels用于索引或直接域对象?
我正在开发一个asp.net mvc3解决方案,它有三个项目:数据、服务和Web。我一直在使用接口尽可能地抽象服务层,以便web只知道服务层,而不知道保存真正域模型的数据。web项目使用视图模型,并简单地将内容作为与域对象相对应的参数传递给服务模型。例如,创建一个用户,我会使用这样的界面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...
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项目中。我认为第一种选择是最好的,但我很好奇是否还有其他选择。谢谢一种方法是有两个独立的项目,一个用于数据类,另一个用于模型/视图模型
您还可以将服务的接口放入模型项目中,并允许Rest服务的使用者访问模型和接口。一种方法是使用两个单独的项目,一个用于您的数据类,另一个用于您的模型/视图模型
您还可以将服务的接口放入模型项目中,并允许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有太多接口。另外,抛出异常,而不是创建自己的错误接口。堆栈跟踪是调试器的朋友。可能有太多接口。另外,抛出异常,而不是创建自己的错误接口。堆栈跟踪是调试器的朋友。请查看我的