题
我有一个使用抽象资料库到负载域对象持久性无知域模型。 我仓库的具体实现(数据访问层(DAL))使用实体框架从SQL Server数据库获取数据。 该数据库有很多的VARCHAR列的长度的限制。 现在,假设我有以下的域类:
public class Case
{
public Case(int id, string text)
{
this.Id = id;
this.Text = text;
}
public int Id { get; private set; }
public string Text { get; set; }
}
和定义如下的抽象存储库:
public abstract class CaseRepository
{
public abstract void CreateCase(Case item);
public abstract Case GetCaseById(int id);
}
在SQLServer中的表的[text]
列定义为nvarchar(100)
现在我知道,我提到了我的领域类(Case
)是持久性无知,但我觉得这是不对的,它允许
对于无法最终由我具体的仓库实现,因为实体框架被保存在text
参数的值
分配text
属性的实体框架生成的类时,当它超过100个字符会抛出异常。
所以我决定,我要检查的域模型这一限制,因为这可以让我尝试之前检查数据的有效性
将其传递到DAL,并因此使得错误报告的详细中心到域对象。我猜你可能会说,我可以检查
约束在我的构造函数和属性setter,但因为我有上百个类,都具有类似的限制,我想一个
要解决的问题
现在,事情是我想出来的是一类叫做ConstrainedString
,定义如下:
public abstract class ConstrainedString
{
private string textValue;
public ConstrainedString(uint maxLength, string textValue)
{
if (textValue == null) throw new ArgumentNullException("textValue");
if (textValue.Length > maxLength)
throw new ArgumentException("textValue may not be longer than maxLength", "textValue");
this.textValue = textValue;
this.MaxLength = maxLength;
}
public uint MaxLength { get; private set; }
public string Value
{
get
{
return this.textValue;
}
set
{
if (value == null)
throw new ArgumentNullException("value");
if (value.Length > this.MaxLength) throw new ArgumentException("value cannot be longer than MaxLength", "value");
this.textValue = value;
}
}
}
此外,我有ConstrainedString
称为String100
的实现:
public class String100 : ConstrainedString
{
public String100(string textValue) : base(100, textValue) { }
}
因此导致不同的实现Case
的,将是这样的:
public class Case
{
public Case(int id, String100 text)
{
this.Id = id;
this.Text = text;
}
public int Id { get; private set; }
public String100 Text { get; set; }
}
现在,我的问题是;我俯瞰一些内置类或其他一些方法,我可以改用?或者,这是一个合理的方法?
任何意见和建议者居多。
感谢您预先
解决方案
我相信你的验证应该驻留在你的域模型。在你的领域约束直接代表一些业务逻辑。最终你必须要验证你坚持下去反正之前。
其他提示
我想这取决于很多因素(以及一些个人喜好)。有时候,约束应该形成域对象的一部分 - 例如社会安全号码/护照号码...... - 这些通常有一个固定的长度,不能作为域名的规则不同 - 不是数据持久性规则(尽管你可能会限制分贝以及)。
有些人喜欢没有这些排序检查在它们的领域模型,而是有一些像上,可以进行检查和通过一个单独的验证器执行从域对象外部的性质的验证属性。
这个问题你可能会与你的方法(虽然不是很难得到周围)越来越任何ORM /映射器 - 如果你正在使用一个 - 要知道如何将字符串/从DB你ConstrainedString地图<。 / p>
在ConstrainedString可能无法得到周围具有大约约束额外的信息域对象的问题,因为它可能需要构建ConstrainedString
如果你改变的情况的制约,它是有道理的,你就必须做一个新的 - 你已经改变了合同,旧代码将不再知道它是否符合要求或不
而不是担心你的资料库会或不会允许,定义什么的您的将允许你的类,并确保你找到一种方法,工作与任何存储库您改为在未来。你拥有你的API - 你的依赖不要
。