我有一个WPF应用程序在本地.MDF文件上使用LINQ-to-SQL.这个解决方案简单,容易,有效,即我设置了一次模型,然后通过LINQ在任何地方读/写数据:
using (var db = Datasource.GetContext())
{
oldItem = (from i in db.Infos
where i.Id == TheId
select i).SingleOrDefault();
CreateForm(db, FormBase, oldItem, Button_Save);
}
Run Code Online (Sandbox Code Playgroud)
对于Silverlight应用程序来说,这个简单的等价物是什么?
搜索我发现了一系列术语:
我想做的就是:
我已经练习了DDD一段时间了4个不同的层:域,演示,应用程序和基础设施.最近,我向我的朋友介绍了DDD概念,他认为它引入了一个不必要的复杂层(特别是针对接口和IoC).通常,在这一点上,我解释了DDD的好处 - 特别是它的模块性.所有繁重的工作都在基础设施中,如果我想彻底改变基础数据访问方法,我只需触摸基础设施层存储库即可.
我朋友的论点是他可以用同样的方式构建一个三层应用程序:
他将创建业务模型(如域模型)并使数据层中的存储库返回这些业务模型.然后他会调用称为数据层的业务层.我告诉他这种方法的问题在于它不可测试.当然,您可以编写集成测试,但是您无法编写真正的单元测试.你能否看到他提出的3层方法的任何其他问题(我知道有,因为为什么DDD会存在?).
编辑:他没有使用IoC.他的例子中的每一层都相互依赖.
我有一个用 C# 开发的 ASP.NET Web 窗体应用程序。
我想通过将 DAL 任务与后面的代码分开来构建我的应用程序。
我在 App_Code DBUtilities中创建了一个类,负责与数据库的通信,以免整个应用程序中出现重复的代码。该类具有获取数据表、标量值等的方法......并且它们接受连接字符串名称和查询命令作为参数作为字符串。
问题是我的代码中仍然保留了所有查询命令。其中许多在页面上重复,这会导致维护问题。
我想知道创建一个包含许多字符串属性并将其与每个特定查询命令相关联的(静态)类QueryRepository是否是一个好习惯。每次我想执行查询命令MyCommand时,我都会将字符串的属性传递给DBUtilities类。更重要的是,如果我需要更改查询命令,我只需在 QueryRepository 类上执行即可。QueryRepository.MyCommand
这是组织我的 DAL 的好方法吗?
在这个特定的应用程序中,没有单独的数据层,数据访问代码位于实体本身中。例如,考虑一个 Customer 实体,然后在定义成员和属性的 Customer.cs 文件中,您可以使用以下方法来加载 Customer 对象
public bool TryLoad(int customerID, out Customer customer)
{
bool success = false
try
{
//code which calls the db and fills a SqlDataReader
ReadDataFromSqlDataReader(reader);
success = true;
}
catch(Exception ex)
{
LogError();
success = false;
}
return success;
}
Run Code Online (Sandbox Code Playgroud)
现在,在 ReadDataFromSqlDataReader(reader) 中,tryparse 用于将数据从 reader 加载到对象中。例如
public void ReadDataFromSqlDataReader(reader)
{
int.TryParse(reader["CustomerID"].ToString(), out this.CustomerID);
PhoneNumber.TryParse(reader["PhoneNumber"].ToString(), out this.PhoneNumber);
... similar TryParse code for all the other fields..
}
Run Code Online (Sandbox Code Playgroud)
使用 TryParse 从阅读器读取所有属性是一个好的做法吗?一位开发人员告诉我,这样做是因为 TryParse 的性能比 int.Parse 更好。但是,当您从数据库读取的值不符合代码期望的值时,您是否希望抛出异常?我的意思是在这种情况下,如果数据库中存在错误的电话号码,那么也许根本不应该初始化该对象,而不是加载带有空电话号码的对象?
使用nodejs/express和mongoose查看nodejs服务器堆栈
什么被认为是最佳实践解决方案?
(1)创建一个
mongoose datamodel模块然后使用模型对象(2)创建一个内部使用mongoose 模型的包装器数据层模块
优点(1)
我非常喜欢mongoose给我的OOP样式类,添加我自己的方法,我自己的setter和getter,我可以添加验证和事件处理程序,并使用DataModel而无需在另一个模块中重新定义它.
(2)
我应该能够通过更简单的实现(测试等)来模拟数据层,或者在需要时切换数据库.
你怎么看?
我正在尝试在 asp.net mvc 项目中组织数据访问层。我已经阅读了很多关于此的不同文章,所以为了解决这个问题,我仍然有一些问题:
我应该为数据库中的每个实体创建存储库实例还是为所有或一个通用实例创建存储库实例,例如PostRepository可以包括像Post,Comment和 之类的实体Tag?
在控制器中,我必须获取一些数据,将其转换为 ViewModel 并将其传递到视图中。哪里是最好的地方?Services,Controller或者别的什么?
如果是Service。我应该创建多少服务?也适用于每个实体,并在必要时传递到控制器 3 或 4 服务?或者也许像我想在存储库中那样做?(创建一个公共服务,其中包含一定数量的存储库。PostService,存储库如PostRepository,CommentRepository和TagRepository)
为什么存储库的.Add方法通常实现为接受要添加的实体实例,并且.Id已经“设置”(尽管可以通过反射再次设置),这应该是存储库的责任?
实现它不是更好.CreateAndAdd吗?
例如,给定一个Person实体:
public class Person
{
public Person(uint id, string name)
{
this.Id = id;
this.Name = name;
}
public uint Id { get; }
public string Name { get; }
}
Run Code Online (Sandbox Code Playgroud)
为什么存储库通常实现为:
public interface IRpository<T>
{
Task<T> AddAsync(T entity);
}
Run Code Online (Sandbox Code Playgroud)
而不是:
public interface IPersonsRpository
{
Task<Person> CreateAndAddAsync(string name);
}
Run Code Online (Sandbox Code Playgroud) domain-driven-design data-access-layer ddd-repositories repository-pattern
只是想收集不同的想法和观点,以确定LINQ属于哪个层(以及为什么)?
我想知道ff:代码将多少次进入数据库的中途.
foreach ($recipients as $recipient) {
$received_email = new ReceivedEmail();
$received_email->setRecipient($recipient);
$received_email->setEmail($email);
$entityManager->persist($received_email);
$entityManager->flush();
}
Run Code Online (Sandbox Code Playgroud)
$recipients 是与ReceivedEmail具有一对多关系的User对象数组
$email 是与ReceivedEmail具有一对多关系的对象.
例如$recipients,如果有五个实体,循环是否总共产生五次数据库访问?还是只有一个?
以上示例是插入新ReceivedEmail记录的最佳方式吗?
谢谢
各位大家好,我想知道web2py dal中是否存在'like'等价物.
我想做这样的事情:
db().select(db.person.name like 'JA')
Run Code Online (Sandbox Code Playgroud)
非常感谢您的帮助!
贾森
asp.net ×2
c# ×2
linq ×2
asp.net-mvc ×1
collections ×1
doctrine ×1
frameworks ×1
mongoose ×1
node.js ×1
orm ×1
php ×1
silverlight ×1
wcf ×1
web2py ×1