在设计业务对象时,我尝试了几种不同的编写数据访问层的方法.有些人比其他人做得更好,但我一直觉得必须有一个"更好"的方式.
我真的只想看看人们在不同情况下处理DAL的不同方式以及他们对技术如何工作或不能正常工作的看法.
我一直在阅读Pro ASP.NET MVC框架,Steven Sanderson,在第11章中讨论了数据验证.
在页390,我们看到将验证逻辑移动到您的模型层一节.在本节中,我们将在第392页中看到一些代码,说明如何实现验证.
代码实现了一个GetRuleViolations()方法,并且该Save()方法使用它来抛出一个RuleException不合适的东西.
但是,在我看来,域层和数据访问层之间没有区别,这里是代码:
public void Save() {
var errors = GetRuleViolations();
if (errors.Count > 0)
throw new RuleException(errors);
// Todo: Now actually save to the database or whatever
}
private NameValueCollection GetRuleViolations() {
// validations...
}
Run Code Online (Sandbox Code Playgroud)
在我正在工作的项目中,我有一个Domain层,尽可能使用持久性,以及数据访问层,通过NHibernate实现数据访问,并实现在Domain层中定义接口的存储库.
如果我按照作者在这里提出的那样实现验证规则,那么在" Save()"方法中,它们会进入我的数据访问层,但至少我认为它们应该驻留在域模型上!
所以,我的问题是:在创建分层应用程序时,使用域层实现域实体并将接口暴露给存储库(持久性无知),数据访问层从域层实现存储库并实现所有数据访问代码,其中验证规则应该存在吗?
我的主要(或至少是第一个)接口将是ASP.NET MVC应用程序,如果这可能会改变任何东西.
谢谢.
我想从我的数据访问层获取数据到我的业务层,然后准备在我的UI中使用.
所以我想知道:读取我的数据DataReader并使用它来填充List<BLClasses>或填充数据集并将数据集DataSet发送到UI层更好吗?
我对良好的性能和可扩展性感兴趣.
是否有自动重试有意义的SQL Server存储过程错误的简明列表?显然,重试"登录失败"错误没有意义,但重试"超时"确实如此.我认为指定哪些错误重试可能比指定哪些错误不重试更容易.
那么,除了"超时"错误之外,还有哪些其他错误适合自动重试?
谢谢!
我最近听说过不同的.NET ORM方法的"粉丝"表达了其他ORM方法的强大,甚至是古怪的选择.坦率地说,有点在黑暗中.
您能解释一下这些.NET ORM解决方案的主要优点吗?
我对1和4有很好的理解,对2和3有一个粗略的理解,但显然不足以理解一个人对另一个人隐含的文化认知.
我正在尝试编写一个在BLL和DAL之间有非常严格的边界的小应用程序,现在我想知道在层之间传递数据(域传输对象)的最佳方法是什么.
我在一个域级(类库)中实现了一些由BLL和DAL访问的类.这些类基本上只包含属性/数据成员,并且当前反映DAL数据.例如:
class CustomerData
{
// some data fields
}
Run Code Online (Sandbox Code Playgroud)
然后我在BLL中实现了一些类:
class Customer : CustomerData
{
// Some methods
}
Run Code Online (Sandbox Code Playgroud)
在我的DAL中,我通过Linq-to-Sql从数据库中获取客户记录.然后我通过以下方式将linq对象映射到我的Domain对象:
CustomerData.field = LinqObject.field
// Etc
Run Code Online (Sandbox Code Playgroud)
因此,我的想法是,当我请求时,我现在是一个从DAL到BLL的CustomerData实例(并且我应该将Customer实例传递给我的UI).
因此,在我的BLL中,我将收到一个CustomerData实例,但现在我想让客户摆脱它.
问题:
谢谢 !
我目前正在尝试构建我的第一个Android应用程序及其学习曲线(我将克服!)因为我来自.net C#/ vb.net网络背景(没有java背景)
我通过谷歌提供的记事本示例,现在正在我自己的应用程序上工作,该应用程序在sqlite数据库中有三个表.
我必须为每个插入,删除,编辑等构建一个方法,然后更多地用于读取数据库.
我很好奇,看看他们是否有任何不错的Dataaccess层有帮助(我已经习惯了流利的NHibernate和使用linq)
在java文件中编写所有这些sql似乎要做很多工作!
这将是一个有点抽象的问题.
我正在研究一个数据访问层框架,它需要区分表,它的抽象模式/布局和具体的表记录.我担心由于这种区别,会有很多代码重复.我可能需要一些方法来避免这种情况.
+-----------+
| Foo |
+-----------+
| +Id: Guid |
+-----------+
Run Code Online (Sandbox Code Playgroud)
请注意,此图可以描述以下任何一种:表模式,具体表或具体表记录,具有Id类型的字段Guid.
把它翻译成代码,我会得到很多类似的类型(成对的三种).我将使用接口来保持示例简短; 我要展示的是类型的相似性:
// these interfaces only need to be implemented once:
interface ISchemaField<T> { string Name { get; } }
interface ITableField<T> { string Name { get; }
int Index { get; } }
interface IRecordField<T> { string Name { get; }
int Index { get; }
T Value { get; set; } }
Run Code Online (Sandbox Code Playgroud)
// these three interfaces are an …Run Code Online (Sandbox Code Playgroud) c# data-access-layer code-duplication separation-of-concerns
所以你在C#中有一个使用Repository模式的DAL,你有一个每个Repository的接口.它受ADO.NET,MS SQL Server和存储过程调用的支持.
这非常适合存储/模拟使用它的存储库,否则在进行单元测试时,我喜欢它!
但是,我很乐意为DAL本身添加一些单元测试.最好使用带有NUnit的Rhino Mocks.但是,如果可以做出一个可以做Rhino无法解决的问题,那么我愿意转向MoQ.
在单元测试期间,我宁愿不让任何数据库与任何数据库通信,以保持它们更"纯粹",同时仍然有效地测试DAL本身.但是,如果没有它与数据库通信,你就无法真正有效地对DAL本身进行单元测试,那么在内存替换或基于便携式文件的替代方案中可能存在哪些替代方案,这些替换方式与SQL Server和相同的SqlConnection和SqlCommand调用兼容.
如果需要,可以重构DAL,只要它不会同时使设计复杂化,就可以更容易注入.已经使用Microsoft Unity,用于DI与存储库模式.
我正在开始一个项目,并且正在为数据访问层的架构而苦苦挣扎.基本上,它需要与具有不同数据库设计的多个后端进行交互.
我想要一个通用的DAL,然后在任何后端执行一个共同的功能.后端具有用于插入,更新等的唯一代码.因此,在1个后端添加Employee将在另一个后端具有不同的代码.
我尝试了Repository模式,但这并不适用于这种情况.我最终只得到了一个Factory模式方法,但最终我会为每个对象创建一个Factory.我可能只能创建1个工厂,但Backend对象将拥有数百个函数,如"SaveEmployee","SavePlan"等.
现在我有以下内容:
DAL
--> DAL.Backend1
--> Employee.Save(employee)
--> Plan.Save(plan)
--> DAL.Backend2
--> Employee.Save(employee)
--> Plan.Save(plan)
Run Code Online (Sandbox Code Playgroud)
在DAL项目中,我为每个Object,Employee,Plan提供了Factory模式,以决定返回和执行哪个DAL的Object.
我很确定这不是最好的架构,所以我想知道是否有更好的模式来解决我的问题.
c# ×3
.net ×2
dns ×2
ado.net ×1
android ×1
asp.net ×1
asp.net-mvc ×1
backend ×1
bll ×1
c#-4.0 ×1
dataset ×1
java ×1
list ×1
mocking ×1
nunit ×1
orm ×1
sql-server ×1
unit-testing ×1
validation ×1