我从MVC3开始,想要使用一些灵活的架构,所以我读了几十篇博客,一本书(Pro ASP.NET MVC 3),阅读了有关SOLID原理的内容,最后得到了一个我喜欢的应用程序结构(或者至少我是这么认为的,到目前为止,因为我还没有建立任何东西):

在这个结构中:
Domain using Services的主要原因是验证POCO(IValidatable)类的Validate方法的唯一键.
我开始用这种结构构建一个参考应用程序,但到目前为止,我遇到了两个问题:
我正在使用Data.Tests项目和存储库的单元测试,但是还没有找到一种方法来注入(使用Ninject)服务的实现(在构造函数中或其他方面),因此Validate方法可以在服务上调用CheckUniqueKey.
我还没有找到关于将Ninject连接到TEST项目的任何参考(很多用于WebUI项目).
我想在这里实现的目标是通过改变DATA组件,能够从EF切换到其他类似DAPPER的东西.
UPDATE
现在(截至2011年8月9日)Ninject正在工作,但我想我错过了一些东西.
我有一个带有两个构造函数的CustomerRepository:
public class CustomerRepository : BaseRepository<Customer>, ICustomerRepository
{
// The repository usually receives a DbContext
public CustomerRepository(RefAppContext context)
: base(context)
{
}
// If we don't receive a DbContext then we create the repository with a defaulte one
public CustomerRepository()
: base(RefApp.DbContext())
{
}
...
}
Run Code Online (Sandbox Code Playgroud)
在TestInitialize上:
// These are for testing the Repository against a test database
[TestInitialize()]
public …Run Code Online (Sandbox Code Playgroud) 我想使用EF 5模型验证来避免数据库中的重复值,所以我使用这样的模型类:
[Table("MeasureUnits")]
public class MeasureUnit : IValidatableObject
{
public int MeasureUnitId { get; set; }
public string Symbol { get; set; }
public string Name { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
using (MeasureUnitRepository rep = new MeasureUnitRepository())
{
MeasureUnit measureUnit = rep.FindDuplicateBySymbol(this);
if (measureUnit != null)
yield return new ValidationResult(
"There is another unit with this symbol, you can't duplicate it",
new[] { "Symbol" });
}
}
Run Code Online (Sandbox Code Playgroud)
存储库类创建DbContext,实现IDisposable,具有查找副本的逻辑,它都可以正常工作.
但是,使用调试器我意识到每次插入或更新都会执行两次验证,因此存储库(和DbContext)也会被实例化并处理两次.
除此之外,还有另一个DbContext存在于控制器中但只是在模型类中找不到使用它的方法,除了在模型的构造函数中包含DbContext,但我觉得它不是正确的解决方案.
是否有更好的"正确"方式来实现此验证?
提前致谢.