【发布时间】:2011-07-26 11:01:41
【问题描述】:
我正在设计我的数据访问代码,数据将存储在 RavenDB 中,我正在尝试查看我当前的设计是否对我将拥有的接口数量过多的抽象。
我将拥有仅保存数据的 DTO,然后我将拥有将具有额外功能的实体(或模型、业务或任何您称之为的)对象。我还将为每个实体提供一个接口,定义它需要拥有的数据。比如:
interface IUser
{
string Id { get; }
string Username { get; }
string Password { get; }
bool ResetPassword { get; }
}
class UserDTO : IUser
{
public string Id { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public UserDTO()
{
Id = null;
Username = null;
Password = null;
ResetPassword = false;
}
}
class User : IUser
{
public string Id { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public User()
{
Id = null;
Username = null;
Password = null;
ResetPassword = false;
}
public User(IUser user)
{
Id = user.Id;
Username = user.Username;
Password = user.Password;
ResetPassword = user.ResetPassword;
}
public ResetPassword()
{
Id = null;
Username = null;
Password = null;
}
}
我希望每个实体都有一个接口的原因是因为我想确保EntityDTO 和Entity 都具有所需的共享数据。
现在为了检索和保存数据,我将使用存储库模式。我将拥有一个名为IDataRepository 的通用接口,然后每个实体都将拥有自己的存储库接口。例如:
interface IDataRepository<T>
{
bool Save(T entity);
bool Delete(T entity);
}
interface IUserRepository : IDataRepository<IUser>
{
IUser Load(string key);
IUser LoadByLogin(string username, string password);
}
class UserRepository : IUserRepository
{
bool Save(T entity)
{
//save code
}
bool Delete(T entity)
{
//delete code
}
IUser Load(string key)
{
//load code
}
IUser LoadByLogin(string username, string password)
{
//load code
}
}
我希望每个实体都有一个存储库接口的原因是,如果我需要为不同的实体使用不同的数据存储选项,我可以这样做。
这看起来是不是太抽象了?
【问题讨论】:
-
为什么要区分
User和UserDTO? -
这看起来像抽象吗?你的意思是?你能澄清一下你想要达到的目标吗?
-
因此您从存储库加载 IUser。你接下来会做什么?将其投射给用户?同样从提供的信息来看,没有证据表明确实需要 DTO。
-
对不起,我上一个问题中缺少的单词,更新
标签: c# design-patterns data-access-layer