我正在尽我所能来设计我的网络应用程序与层之间的良好分离.我正在使用存储库模式,因此有一个SQLObjectRepository,它由我的Web服务调用,由我的Web前端调用.
在我的对象模型中,用户与一个或多个区域相关联,这些区域应该过滤他们应该有权访问的对象.我的问题是,当我查询对象时,是否将代码放在服务中以设置对象的权限,或者该代码是否应该存储在存储库中?如果用户是2个区域的成员,我应该将用户作为参数传递给服务,还是应该将用户的区域传递给服务?
如果人们认为这已被打死,我会提前道歉.我刚刚花了几个小时在这里搜索和阅读很多优秀的帖子,但我仍然感到困惑.
我混淆的根源是DTO与DDD和存储库.我希望我的POCO域对象具有智能,我想从存储库中获取它们.但似乎我必须违反一些封装规则才能使其工作,而且似乎它可以将DTO转变为他们的头脑.
这是一个简单的例子:在我们的目录应用程序中,Part可以是包含许多其他部分的包.因此,Part POCO有一个'GetChildren()'方法返回IEnumerable <Part>是有道理的.它甚至可能会在列表中出现其他内容.
但该清单如何解决?似乎存储库就是答案:
interface IPartRepository : IRepository<Part>
{
// Part LoadByID(int id); comes from IRepository<Part>
IEnumerable<Part> GetChildren(Part part);
}
Run Code Online (Sandbox Code Playgroud)
和
class Part
{
...
public IEnumerable<Part> GetChildren()
{
// Might manipulate this list on the way out!
return partRepository.GetChildren(this);
}
}
Run Code Online (Sandbox Code Playgroud)
所以现在我的目录的使用者除了(正确地)从存储库加载部件之外,还可以通过直接调用GetChildren(部分)来绕过一些部分封装的逻辑.不是那么糟糕吗?
我读到存储库应该提供POCO,但DTO适用于在层之间传输数据.计算了许多零件属性 - 例如,价格是根据复杂的定价规则计算的.价格甚至不会来自存储库的DTO - 因此将定价数据传递回Web服务似乎需要DTO使用Part,而不是相反.
这已经太长了.拧开我的头在哪里?
我有一个两个存储库目录和用户,我有一个情况,我需要从用户仓库调用目录仓库中的方法,这是一个好的做法还是有更好的方法?
我已经查看了Repository模式,并且我认识到我过去使用过的一些让我感觉良好的想法.
但是现在我想编写一个使用这种模式的应用程序,但是我想要从存储库提供程序中解密出来的实体类.
我会创建几个程序集:
在我发现生成的类和CustomDataContext类之间的深度依赖性之前,研究LINQ to SQL看起来非常有效,在实现所有这些方面所花费的时间.
如何在这种情况下使用LINQ to SQL?
provider design-patterns decouple repository-pattern linq-to-sql
众所周知,如果已经加载了实体,则无法直接在Linq to SQL中设置外键ID.但是,您可以通过它的外键查找实体,然后使用实体关系将实体设置为外部实体.(为了简单起见,我在这里取出了枚举并使用了整数值).即如果我有一个加载的约会实体和一个相关的AppoinmentStatus实体,我不能这样做: -
ExistingAppointment.AppointmentStatusID = 7
Run Code Online (Sandbox Code Playgroud)
但我可以这样做: -
ExistingAppointment.AppointmentStatus = (From appstat In db.AppointmentStatus _
Where appstat.StatusID = 7 _
Select appstat).Single
Run Code Online (Sandbox Code Playgroud)
我有这样的事情乱丢我的代码,我想重构.所以...
我显然可以在这样的模块中使用辅助方法: -
Module Helper
Public Shared Function GetAppointmentStatus(ByVal AppStatusID As Integer) As AppointmentStatus
GetAppointmentStatus = (From appstat In db.AppointmentStatus _
Where appstat.AppointmentStatusID = AppStatus _
Select appstat).Single
End Function
End Module
Run Code Online (Sandbox Code Playgroud)
我甚至可以把它变成一个扩展方法,就像这样.
Imports System.Runtime.CompilerServices
Module Helper
Extension()> _
Public Shared Function GetAppointmentStatus(ByVal db as DataClassesDataContext, ByVal AppStatusID As Integer) As AppointmentStatus
GetAppointmentStatus = (From appstat In …Run Code Online (Sandbox Code Playgroud) 为什么复制构造函数对于不可变对象是不必要的?请为我解释一下.
我想我读过关于DDD的所有书以及如何在C#中应用它(3-5本书,不记得它是几年前).
但是在过去的两年里,我在所有项目中使用了贫血领域模型并且运作良好.实际上我从未尝试过实现纯域模型,而且我从未见过使用干净域模型方法的一段代码.
例如,本书中有关DDD的代码不遵循DDD风格.以Tim MacCarthy的代码为例,关于DDD http://dddddsds.de,看看他的域名对象,他们对任何行为都很干净,只是DTO是他集成到域对象中的唯一东西就是验证,如果我在DDD中正确记住你的域不应该处于无效状态,所以你应该防止设置无效值并抛出异常,而不是允许设置它们并在某些时候进行验证.
与其他书籍和示例代码相同的情况,它们都非常简单,只显示一个具有属性的类,最多可以找到一组插入\ remove子对象的方法,这些方法设置了父属性.例如,我几乎看不到使用域事件或将服务注入域对象的代码.
2003年Martin Fowler写了一篇文章告诉我们,贫血领域模型是一件坏事http://www.martinfowler.com/bliki/AnemicDomainModel.html 8年过去了,我认为贫血模型现在非常流行(它演变为分层架构) ).并且在3层RIA开发中使用了很多.
所以我的主要问题是干净的DDD乌托邦?它死了吗?包括我在过去3年里看到的所有代码是分层架构(在我看来,它是本质上贫血的领域模型).如果存在,我非常希望看到一些干净的DDD代码.
Windows 8 Metro应用程序应如何连接到中央数据库?
我在UpdatePanel_2中有一个下拉列表,当在UpdatePanel_1中单击Button_1时,它会被填充.
我的ddlist标记是,
<asp:DropDownList id="drop1" runat="server" EnableViewState="true" AutoPostBack="true" OnSelectedIndexChanged="Drop1_SelectedIndexChanged" />
Run Code Online (Sandbox Code Playgroud)
然后代码背后是,
protected void Drop1_SelectedIndexChanged(object sender, EventArgs e)
{ }
Run Code Online (Sandbox Code Playgroud)
我也尝试将AutoPostback = true放到我的DropDownList中,仍然没有成功.
我还添加了triggre来更新面板2,但没有增益,
<Triggers>
<asp:AsyncPostbackTrigger ControlID="drop1" EventName="SelectedIndexChanged" />
</Triggers>
Run Code Online (Sandbox Code Playgroud)
我在使用按钮填充DropDownList而不是PAGE LOAD METHOD请在回答之前阅读.谢谢
对于像doMC和doSMP这样的一些软件包,我会收到警告和无法访问库(doMC).如下图所示,我对subselect没有问题,因此没有文件/目录权限问题.还试过repo = http://cran.us.r-project.org和其他人,没有运气.请指教.
ps:对于意想不到的日文字符,我不知道; 我认为这是一个可分离的问题; 尚未得到support.rstudio.org/help/discussions/problems/6009-japanese-characters-show-unexpectedly的回复
> install.packages('doMC')
Warning in install.packages :
package ?oMC?is not available (for R version 3.0.0)
Installing package into ?:/Users/YULE/Documents/R/win-library/3.0?(as ?ib?is unspecified)
Warning in install.packages :
package ?oMC?is not available (for R version 3.0.0)
> install.packages('subselect')
Installing package into ?:/Users/YULE/Documents/R/win-library/3.0?(as ?ib?is unspecified)
trying URL 'http://cran.rstudio.com/bin/windows/contrib/3.0/subselect_0.12-2.zip'
Content type 'application/zip' length 1295653 bytes (1.2 Mb)
opened URL
downloaded 1.2 Mb
package ?ubselect?successfully unpacked and MD5 sums checked
The downloaded binary packages are in
C:\Users\YULE\AppData\Local\Temp\Rtmp6DK5mn\downloaded_packages
> library(subselect)
--------------------------------------------------------------------------------- …Run Code Online (Sandbox Code Playgroud) architecture ×2
c# ×2
linq-to-sql ×2
.net ×1
copy ×1
decouple ×1
domc ×1
immutability ×1
odata ×1
oop ×1
poco ×1
provider ×1
r ×1
security ×1
tablet ×1
updatepanel ×1
vb.net ×1
web-services ×1
webforms ×1
windows ×1
windows-8 ×1