我正在开发一个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项目中。我认为第一种选择是最好的,但我很好奇是否有其他选择。谢谢
答案 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。
现在控制器使用UserModel而不是User。这使您的Web应用程序不会弄乱您的数据类。
您还可以将服务的接口放入模型项目中,并允许Rest服务的使用者访问模型和接口。