我只是在学习ASP.NET c#并尝试将最佳实践融入我的应用程序中.我读到的所有内容都表示基于关注点的分离将我的应用程序分层为DAL,BLL,UI等.我没有传递数据表,而是考虑使用自定义对象,这样我就可以松散地耦合到我的数据层,并且可以利用VS中的intellisense.我假设这些对象会被视为DTO?
首先,这些对象在我的图层中的位置?BLL,DAL,其他?
其次,当从SQL填充时,我应该循环通过数据读取器来填充列表还是首先填充数据表,然后循环遍历表以填充列表?我知道你应该尽快关闭数据库连接,但是填充数据表然后循环遍历列表似乎需要更多的开销.
第三,我现在看到的一切都说使用Linq2SQL.我打算学习Linq2SQL,但此时我正在使用没有外键设置的遗留数据库,我没有能力修复它.另外,在开始进入像nHibernate这样的ORM解决方案之前,我想了解更多关于c#的知识.同时我不想为每个查询键入所有连接和SQL管道.现在可以使用Enterprise DAAB吗?
首先,我使用没有任何ORM框架的Web表单.
我一直在努力如何使我的域对象"智能"和"丰富",因为它们可以在不允许他们访问我的服务和存储库层的情况下.我最近的尝试是为在线商店创建礼券模型.
我看到的主要反复出现的问题是:
越来越多的逻辑不断引入服务层.对存储库的所有调用必须通过服务层并且每次验证参数时(例如 - 存在于db等中).结果,我的服务层正在增长,但我的域对象只有一些简单的合同验证.甚至对象验证也在服务层中,因为如果项的ID为null,它将检查db以确保代码是唯一的.IHMO,系统的消费者不应该关心他们需要的功能是否处理持久性.
我有一个单独的POCO用于兑换礼券时的交易日志条目.我假设我应该将这些交易的清单或集合作为我的礼券模型的属性,但我仍然不确定何时应该填写该属性.我是否在服务上添加了一个单独的方法,用于将事务加载到按需对象(例如 - LoadTransactions(gc object)),或者是否应在请求现有礼品证书或礼品证书列表时自动加载事务(或者getGCs中的一个选项,用于加载事务)
那些像"可用余额"这样的计算字段......我应该在我的对象上拥有这样的属性吗?无论何时我使用该对象,我都需要不断更新该属性以确保它是最新的.现在我只有一个服务方法GetBalanceByCode(gc代码).
即使是像兑换礼券的行动基本上是100%的数据中心(需要一定的输入参数,验证并添加事务日志条目DB).
c# architecture asp.net domain-driven-design repository-pattern
在针对不同问题的SO响应中,用户表示它允许您避免将路由值硬编码到html链接标记中,但这不是真正有效,因为您必须将控制器,操作,区域等放入字符串,所以你仍然硬编码路线值.
这怎么样:
@Html.ActionLink(linkText: "MyLink", actionName: "MyAction", controllerName: "MyController", new { id = @myId }, new { area = "SomeArea"})
Run Code Online (Sandbox Code Playgroud)
比这更好:
<a href='/SomeArea/MyController/MyAction/myId'>MyLink</a>
Run Code Online (Sandbox Code Playgroud) 我有以下表格:
Cateogories
项目
Items.CategoryID上有一个外键约束.创建新项目时,可能不会分配任何类别.
是否更好的设置Items.CategoryID以允许空值并处理我的代码中的空值或更好地不允许空值,将默认的CategoryID设置为1,并在Categories表中创建一个名为"Uncategorized"的虚拟记录,然后处理我的代码中的虚拟类别?
我已经阅读了关于Mercurial子存储库的每个问题,但我仍然不确定它是如何工作的.我们在IIS上使用hgweb.cgi,因此我们有http://所有repos的路径.
这是基本布局:
/Libraries - http://server/Libraries
/Project1 - http://server/Project1
/Project1/LibrariesSubrepo - http://server/Project1/LibrariesSubrepo (clone of libraries)
/Project2 - http://server/Project1
/Project2/LibrariesSubrepo - http://server/Project2/LibrariesSubrepo (clone of libraries)
Run Code Online (Sandbox Code Playgroud)
在.hgsub文件中,我将路径设置为:
LibrariesSubrepo = LibrariesSubrepo
Run Code Online (Sandbox Code Playgroud)
如果我想处理项目,我将它们从服务器克隆到我的工作站,所以我有一个Project1和Project2的克隆,它也会自动拉出子目录.
在我本地工作站的project1中,我对/ Project1/LibrariesSubrepo中的文件进行了一些更改.如何确保这些更改使其返回到服务器上的库的源代码库?我是否必须手动将更改从subrepo推送到subrepo的源repo?
我希望能够在本地更改Project1 repo,然后提交/推送这些更改,然后在Project2中,我应该能够从服务器中提取更改Project2/LibrariesSubrepo的更改到最新版本.
我有一个使用MD5进行盐渍和散列的旧密码数据库.我想更新系统,以便数据更安全.
第一种选择是在用户登录并在一段时间后停用旧用户时将用户转换为新的哈希方案(Salt + Scrypt或PBKDF2 HMACSHA256),这样他们就必须使用密码恢复功能,该功能会自动更新其哈希值.
允许我立即升级所有人的另一个选项是采用现有的MD5哈希值,为每个哈希值添加一个新的随机盐值,然后使用新的哈希方案(Salt + Scrypt或PBKDF2 HMACSHA256)对结果进行哈希并存储该值到数据库并删除旧值.
然后当用户登录时,我将不得不应用旧方法,然后应用新方法.我更喜欢第二个选项,因为它允许我尽早从数据库中删除所有旧的不安全哈希.
盐和重现现有的哈希是否安全?MD5是如此破碎,以至于我可以运行脚本来解密密码并使用新方案重新散列它们吗?
或者最好的解决方案是两种方案的组合?这样我就不必在数据库中保留现有的MD5哈希不安全状态,我可以将用户迁移到新系统一段时间吗?
我需要从使用curl的网页标题中获取2个值.我已经能够使用以下方法单独获取值:
response1=$(curl -I -s http://www.example.com | grep HTTP/1.1 | awk {'print $2'})
response2=$(curl -I -s http://www.example.com | grep Server: | awk {'print $2'})
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何使用单个curl请求单独grep值,如:
response=$(curl -I -s http://www.example.com)
http_status=$response | grep HTTP/1.1 | awk {'print $2'}
server=$response | grep Server: | awk {'print $2'}
Run Code Online (Sandbox Code Playgroud)
每次尝试都会导致错误消息或空值.我确信这只是一个语法问题.
我试图弄清楚如何为我的购物车设置一个干净的架构,而不是过度设计或最终导致贫血的域模型.现在我只想使用没有任何ORM框架的标准ADO数据库逻辑.(我也在学习EF4.1,但还不够好用于制作)
理想情况下,我只为每个Business对象/实体和将处理持久性的存储库/数据类都有一个POCO.为了简单起见,我想将POCO紧密地耦合到数据层,它将返回POCO.如果我也将DTO添加到混音中,那么我最终会为每个区域(gc,顺序,项目,付款等)提供5-6个类文件,这对于简单的应用来说似乎太过分了.我可以随时改进.
我正在做的第一堂课是礼券.其中一种方法是创建一个新的GC.在此方法中,我将需要查询数据库以确保系统中尚不存在新代码.可以在此方法中调用数据层/ repo吗?
数据层/ repo应该是静态的吗?我应该只通过POCO本身揭露它吗?
我应该完全删除数据层并直接在我的POCO中调用数据(活动记录样式)吗?
我需要一个简单的架构,这样我就可以分离出一些问题,而不会让事情变得复杂.数据库提供程序和表结构至少在接下来的几年内不会发生变化.
这是一些代码..只需要弄清楚部件的去向.
public GiftCertificateModel
{
public int GiftCerticiateId {get;set;}
public string Code {get;set;}
public decimal Amount {get;set;}
public DateTime ExpirationDate {get;set;}
public void Redeem(string code, decimal amount)
{
//need to validate the input
//need to insert a record to the transaction log table (call the repo or does this entire method need to be in the repo?)
}
public void GetNewCode()
{
//need to create random alpha num code
//need to make sure …Run Code Online (Sandbox Code Playgroud)