好吧,当我学习JavaScript时,我读过的所有书籍和互联网文章都显示了将参数传递给e处理JavaScript事件的函数的代码,例如下面的代码块:
function myEvent(e) {
var evtType = e.type
alert(evtType)
// displays click, or whatever the event type was
}
Run Code Online (Sandbox Code Playgroud)
我总是接受它的方式,但现在我有一些问题(这对我来说非常混乱):
e是从哪里来的?当我查看整个JavaScript文件时,e似乎根本不存在.e给函数?如果我没有传递e给他们,功能是否会停止工作?考虑下面的代码块.e传递给匿名内部函数的事件变量().假设我想在匿名函数之外使用事件对象(可能在行上方/下方的element.onkeypress行中).我怎样才能做到这一点?
element.onkeypress = function(e) {
if(e.keyCode) {
element.keyCode = e.keyCode;
} else {
element.keyCode = e.charCode;
}
};
Run Code Online (Sandbox Code Playgroud)关于具有NoSQL数据库的事务脚本,有一个类似的主题,但这一个是关于模式的.从我发现的事务脚本,它根本不是面向对象的.它基本上是程序代码,尽管它可以在其代码的每一行中使用对象.
更好的解决方案是使用域模型,与活动记录或数据映射器相结合,具有工作单元/身份映射/延迟加载/查询对象等.事务脚本可能很容易使用,但它实际上是程序编程,因此应该被视为面向对象世界的反模式.
你怎么看?您是否同意交易脚本是反模式的?或者你真的有办法设计一个面向对象的事务脚本而不是伪装的程序吗?我怀疑这是可能的.
我试图映射与同一实体的多对多关系.该User实体有一个IList<User>数据字段Contacts,用于存储用户的联系人/朋友信息:
public class User : DomainModel
{
public virtual IList<User> Contacts { get; protected set; }
//irrelevant code omitted
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用流畅的API来映射这么多对多的关系时,它给了我一些麻烦.显然,当我HasMany()在该user.Contacts属性上使用时,它没有WithMany()方法可以调用下一个.Visual Studio中的intellisense只显示WithOne(),但不显示WithMany().
modelBuilder.Entity<User>().HasMany(u => u.Contacts).WithMany()
// gives compile time error: CS1061 'CollectionNavigationBuilder<User, User>' does not contain a definition for 'WithMany' and no extension method 'WithMany' accepting a first argument of type
Run Code Online (Sandbox Code Playgroud)
那么为什么会这样呢?有没有什么我做错了映射这种多对多的关系?
好吧,我一直试图找出数据映射器和存储库之间的区别,但到目前为止我还没有.在我看来,专家程序员说"存储库是查询构造代码集中的映射层的另一个抽象层".这似乎可以理解,但仍然有点抽象.我之前读过stackoverflow上的这篇文章,它让我更加困惑: Data Mapper模式与存储库模式有何不同?
我想我需要的是关于两种模式如何不同的简单解释和具体/实际示例,以及数据映射器不具备的存储库,反之亦然.你们中的任何人都知道一个关于说明数据映射器和存储库概念的好例子吗?如果它是相同的示例,只有一个使用数据映射器而另一个使用存储库会更好.谢谢,我非常感谢.到目前为止我仍然很困惑......
我正在编写一个希望遵循 DDD 模式的应用程序,一个典型的实体类如下所示:
@Entity
@Table(name = "mydomain_persons")
class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(name="fullname")
private String fullName;
@OneToMany(cascade=ALL, mappedBy="item")
private Set<Item> items;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,由于 JPA/Hibernate 严重依赖于实体类的注释,我的域实体类现在被持久性感知注释所污染。这违反了 DDD 原则,也违反了层的分离。它还给我带来了与 ORM 无关的属性的问题,例如事件。如果我使用@Transient,它不会初始化事件列表,我必须手动执行此操作,否则会出现奇怪的错误。
我喜欢域实体是 POJO(或 POKO,因为我使用 Kotlin),所以我不想在实体类上有这样的注释。但是,我绝对不希望使用 XML 配置,这很可怕,这也是 Spring 开发人员首先转向注释的原因。
我有哪些可用的选项?我应该定义一个包含此类注释的 DTO 类和一个将每个 DTO 转换为相应域实体的 Mapper 类吗?这是一个好习惯吗?
编辑:我知道在 C# 中,实体框架允许使用配置类在实体类之外创建映射类,这是比 XML 地狱更好的替代方法。我不确定这种技术是否在 JVM 世界中可用,有人知道下面的代码是否可以用 Spring 完成吗?
public class PersonDbContext: DbContext
{
public DbSet<Person> People { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//Write Fluent API configurations …Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的应用程序应用域驱动设计原则,其中包含包含数据字段和业务逻辑的丰富域模型.我读过许多DDD书籍,但似乎他们的域名模型(称为实体)非常简单.当我有一个包含10-15个数据字段的域模型时会出现问题,例如下面的那个:
class Job extends DomainModel{
protected int id;
protected User employer;
protected string position;
protected string industry;
protected string requirements;
protected string responsibilities;
protected string benefits;
protected int vacancy;
protected Money salary;
protected DateTime datePosted;
protected DateTime dateStarting;
protected Interval duration;
protected String status;
protected float rating;
//business logic below
}
Run Code Online (Sandbox Code Playgroud)
如您所见,此域模型包含许多数据字段,所有这些字段都很重要,无法将其删除.我知道一个好的富域模型不应该包含setter方法,而是将其数据传递给构造函数,并使用业务逻辑来改变状态.但是,对于上面的域模型,我无法将所有内容传递给构造函数,因为它将导致构造函数方法中的15个以上参数.一个方法不应该包含超过6-7个参数,你不觉得吗?
那么我该怎么做才能处理具有大量数据字段的域模型呢?我应该尝试分解吗?如果是这样,怎么样?或者,我应该在实例化时使用Builder类或反射来初始化它的属性,这样我就不会用如此多的参数污染构造函数?谁能提出一些建议?谢谢.
我有一个关于域驱动设计的问题.在我的应用程序的用户帐户/配置文件有界上下文中,有一个用户实体,其中包含帐户信息(ID,用户名,密码,电子邮件,盐等)和个人资料信息(全名,头像,生日,性别等).我还有另一个有效的工作岗位/应用上下文,其中每个工作岗位都有雇主用户,每个工作申请都有申请人用户.
问题是,作业有限上下文中的雇主/申请人用户是否应该是我用于用户帐户有限上下文的相同用户实体?或者我应该为雇主和申请人设计不同的用户类型实体?
如您所见,只有来自帐户有界上下文的ID,全名,电子邮件和头像等信息才与作业有限的上下文相关.如果雇主/申请人是来自帐户/用户档案的相同用户实体,则它将加载更多无用的数据(不需要知道雇主/申请人的用户密码).但是如果我为它们创建不同的实体类,它将使数据持久性更加棘手,因为在不同实体类中进行的更改可以更改同一数据库表中的相同数据.
你怎么看?我是否应该为不同的有界上下文/聚合使用一个用户实体用于所有或不同的用户实体?如果需要后者,我该如何处理数据/实体持久性?
persistence entity domain-driven-design aggregate bounded-contexts
好吧,我一直在阅读一本关于域驱动设计的书,它的标题是域驱动设计的模式,原理和实践(PPPDDD).到目前为止,我很喜欢阅读它,它在.NET世界中提供了很多关于DDD的见解.但是,有一件事困扰着我.在第21章(存储库模式)中,作者提出了以下两个主张:
索赔1:
存储库不是对象.它是一个程序边界和一个明确的契约,当它在域模型中的对象命名方法时需要尽可能多的努力.
索赔2:
存储库是域模型和持久性存储之间的契约.它应该只根据域编写而不考虑底层的持久性框架.定义意图并使其明确; 不要将存储库合同视为面向对象的代码.
那么存储库模式不是OOP,而是程序化的?您是否同意本书作者的主张?为什么明确存储库方法,例如findByUsername(字符串Username)会使存储库程序性质?
我想编写OO代码,而不是程序代码.如果存储库是程序性的,它根本就会破坏我使用这种模式的目的.我真的希望作者所说的不是真的,你怎么看?
我的 PC 上似乎安装了 incredibuild,可能与 Visual Studio 捆绑在一起。它会在我的 PC 运行时自动启动,并且磁盘使用率很高,最终会降低整个 PC 的速度。我将不得不阻止它运行以使我的 PC 再次快速运行。
我尝试删除它,但每次删除它,即使我过去 2 周没有使用 Visual Studio,它也会在几天后恢复。从启动中禁用它也不起作用,无论如何它会在 PC 启动时运行。那么我应该用 Incredibuild 做什么?我不想卸载 Visual Studio,但我需要 Incredibuild 消失。
在smalltalk中,一切都通过向接收器对象发送消息而发生.其语法通常遵循格式接收器消息,其中接收器是发送消息的对象.现在我不能停止想知道,smalltalk消息的发送者是什么?请考虑以下smalltalk语句:
aMorph color: Color yellow
Run Code Online (Sandbox Code Playgroud)
我可以看到aMorph作为消息的接收者,但发送者呢?标准的smalltalk消息语法只有接收者和消息(选择器+参数),我无法识别发送者的位置和位置.或许,消息实际上可以发送自己?
我记得浏览过一篇关于pharo smalltalk反思的文章,其中提到了邮件的发件人,但我无法找到或理解这个"发件人"是什么.任何人都可以向我解释这个吗?谢谢.
domain-model ×2
oop ×2
orm ×2
repository ×2
.net ×1
.net-core ×1
aggregate ×1
asp.net-core ×1
c# ×1
data-access ×1
datamapper ×1
entity ×1
events ×1
hibernate ×1
incredibuild ×1
javascript ×1
linq ×1
message ×1
persistence ×1
smalltalk ×1
spring ×1
spring-boot ×1