我正在学习领域驱动设计,但是有些实际问题令我感到困惑,我认为看到一些好的样本可能会被清除.
有没有人知道一些很好的工作代码示例,它们可以很好地建模基本的DDD概念?
特别感兴趣
如果我在我的模型中声明实体关系为虚拟,则不需要Include在我的LINQ查询中使用该语句,对吧? -
例如:这是我的模型类:
public class Brand
{
public int BrandID { get; set; }
public string BrandName { get; set; }
public string BrandDesc { get; set; }
public string BrandUrl { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在,对于上面的模型类,我不需要使用var brandsAndProduct = pe.Brands.Include("Products").Single(brand => brand.BrandID == 22);.
相反,我可以使用简单的var brandsAndProduct = pe.Brands.Where(brand => brand.BrandID == 22);,我将在访问时自动使相关实体可用.
我的理解是正确的吗?
另外,请告诉我在什么情况下我应该更喜欢一个?
例如,当我写:
string x = "turtle";
x.Go();
Run Code Online (Sandbox Code Playgroud)
没有红色波浪线检测到String上没有Go()方法.
只有在我编译时才会检测到错误.
我刚刚升级到Windows 7,我有Visual Studio 2008.
在我的旧环境中,在实际编译之前检测到错误.
有没有我错过的环境?
编辑:"工具 - >选项 - >文本编辑器 - > C# - >编辑器中的下划线错误"已选中.
我没有"Live Semantic"选项.也许我需要去SP1?
有人可以向我解释抽象类和标记为MustInherit的类之间的区别吗?
两者都可以实现共享和实例构造函数和逻辑.两者都可以/必须继承.
那么为什么要使用一个而不是另一个呢?
我知道这可能不是一个很好的问题.但我真的不知道该怎么办,我正在寻找原因.
我在本地运行我的自定义Angular 5 + Material 2应用程序mat-dialog并且mat-tab非常慢.我甚至试图关闭动画,但它仍然很慢.
此外,在编译生产时也会产生ng-build --prod非常慢的结果.
所以也许我对这个对话做错了.所以这是我的代码:
openEditDialog(car:Car) {
let dialogRef = this.dialog.open(EditDemandComponent);
dialogRef.componentInstance.id = car.id;
dialogRef.afterClosed().subscribe(result => {
console.log('The edit dialog was closed');
});
}
Run Code Online (Sandbox Code Playgroud)
我的构造函数:
constructor(
private httpClient: HttpClient,
private dialog: MatDialog, etc..
Run Code Online (Sandbox Code Playgroud)
和对话框组件的构造函数:
constructor(public dialogRef: MatDialogRef<EditDemandComponent>, etc..
Run Code Online (Sandbox Code Playgroud)
在对话框组件中我正在使用代码 this.dialogRef.close();
我真的没有选择,我真的没有得到它,因为材料2文档非常快,对我来说,本地一切都超级慢.由于动画不顺畅,因此速度很慢.至少需要2秒钟才能打开对话框或切换标签页.
这是我的版本:
"dependencies": {
"@angular/animations": "^5.0.2",
"@angular/cdk": "^5.0.0-rc.1",
"@angular/common": "^5.0.0",
"@angular/compiler": "^5.0.0",
"@angular/core": "^5.0.0",
"@angular/flex-layout": "^2.0.0-beta.10-4905443",
"@angular/forms": "^5.0.0",
"@angular/http": "^5.0.0",
"@angular/material": "^5.0.0-rc.1",
"@angular/platform-browser": "^5.0.0",
"@angular/platform-browser-dynamic": "^5.0.0",
"@angular/router": "^5.0.0",
"core-js": "^2.4.1", …Run Code Online (Sandbox Code Playgroud) 我们正在使用manifest.json如下文件:
{
"name": "Our app",
"description": "Our app description",
"short_name": "our-app",
"icons": [
{
"src": "/content/favicons/android-chrome-36x36.png",
"sizes": "36x36",
"type": "image/png",
"density": 0.75
},
{
"src": "/content/favicons/android-chrome-48x48.png",
"sizes": "48x48",
"type": "image/png",
"density": 1
},
{
"src": "/content/favicons/android-chrome-72x72.png",
"sizes": "72x72",
"type": "image/png",
"density": 1.5
},
{
"src": "/content/favicons/android-chrome-96x96.png",
"sizes": "96x96",
"type": "image/png",
"density": 2
},
{
"src": "/content/favicons/android-chrome-144x144.png",
"sizes": "144x144",
"type": "image/png",
"density": 3
},
{
"src": "/content/favicons/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png",
"density": 4
}
]
}
Run Code Online (Sandbox Code Playgroud)
连同它所在的图标:/content/favicons/manifest.json.所以我们这样引用它: …
我正在使用sidenav容器路由器和自定义生成的菜单:
<mat-sidenav-container>
<mat-sidenav #sidenav>
<app-menu></app-menu>
</mat-sidenav>
<router-outlet></router-outlet>
</mat-sidenav-container>
Run Code Online (Sandbox Code Playgroud)
在菜单组件内部我使用默认的角度4路由器链接:
<ul>
<li *ngFor="let hero of heroes">
<a mat-button [routerLink]="['/hero/', hero.id]" queryParamsHandling="merge">
{{hero.name}}
</a>
</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
我想要做的是Material sidenav在点击其中一个路由器链接时关闭它.
我可以向你保证,如果没有点击事件路由工作正常,它就不会关闭我的sidenav,因为路由器插座位于侧面导航内.
但是,当我添加(click)="sidenav.close()"到a我的整个页面突然刷新,而不是只是跟随路由器链接.
我尝试了很多东西,但我似乎无法弄明白,希望有人可以帮忙!
我想创建一个这样的方法:
var result = database.Search<EntityType>(x=>x.Name, "Entity Name field value");
result = database.Search<EntityType>(x=>x.Id, "Entity Id field value");
result = database.Search<EntityType2>(x=>x.Id, "Entity2 Id field value");
result = database.Search<EntityTypeAny>(x=>x.FieldAny, "EntityAny FieldAny value");
Run Code Online (Sandbox Code Playgroud)
我该如何实现这个方法?
我试图通过考虑下一个和以前的记录来订购特定的查询,但我似乎无法完成它.我想通过数字和字母来订购,但是,例如,如果数字1的最后一个字母等于数字2中的一个字母,我想更改顺序,以便该字母与以下字母匹配记录.
Create script and SQL fiddle demo
create table Parent (
id [bigint] IDENTITY(1,1),
number bigint NOT NULL,
PRIMARY KEY (id)
)
GO
create table Child (
id [bigint] IDENTITY(1,1),
parentId BIGINT,
letter VARCHAR(1) NOT NULL,
PRIMARY KEY (id),
UNIQUE (parentId, Letter),
FOREIGN KEY (parentId) REFERENCES Parent(id)
)
GO
INSERT Parent (number) VALUES (1)
INSERT Parent (number) VALUES (2)
INSERT Parent (number) VALUES (3)
INSERT Child (parentId, letter) VALUES (1, 'A')
INSERT Child (parentId, letter) VALUES (1, 'C')
INSERT Child …Run Code Online (Sandbox Code Playgroud) 我正在使用这样的内存EF Core数据库:
var options = new DbContextOptionsBuilder<DmpContext>()
.UseInMemoryDatabase("test")
.Options;
var context = new CustomContext(options);
Run Code Online (Sandbox Code Playgroud)
我正在使用仿冒品添加一些随机数据。
var resources = new Faker<Resource>()
.RuleFor(x => x.Name, x => x.Name.FullName())
.Generate(20);
Run Code Online (Sandbox Code Playgroud)
在此资源集合中,所有id仍为零。
当我执行AddRange时,我希望生成ID:
context.Resources.AddRange(resources);
context.SaveChangesAsync();
Run Code Online (Sandbox Code Playgroud)
但是它们不是生成的。
System.AggregateException:发生一个或多个错误。(无法跟踪实体类型'Resource'的实例,因为已经跟踪了另一个{'ResourceId'}具有相同键值的实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。
所以我想,然后让我直接设置它们,然后自己创建一个自动增量机制。那行得通。
但是,当我随后尝试测试我的Add方法时(这些方法将插入记录)。我无法在这些方法中设置ID,因为ID甚至不在界面中。再次,我希望EF自动生成ID,但是它会尝试插入ID 1(已经使用,因为我已经生成了ID 1,直到20)。
有谁知道如何告诉内存数据库中的EF核心始终自动递增其密钥?