小编Jor*_*ker的帖子

DDD:在单个事务中创建具有共享生命周期的多个聚合

据我所知,一般规则是每个事务只应修改一个聚合,主要是为了并发和事务一致性问题。

我有一个用例,我想在单个事务中创建多个聚合: a RestaurantManager、 aRestaurant和 a Menu。它们看起来像是一个单一的聚合体,因为它们的生命周期一起开始和结束:在域内创建RestaurantManager没有 a 的是没有意义的Restaurant,反之亦然;Restauranta和 a也是如此Menu。此外,如果RestaurantRestaurantManager被删除(未注册),则应将它们全部一起删除。

但是,我已将它们拆分为单独的聚合,因为一旦创建,它们就会单独更新,维护自己的不变量,并且我不想将它们全部加载到内存中只是为了更新 上的一个属性Restaurant

将它们联系在一起的唯一因素是它们的生命周期。

我的问题是,这是否代表可以违反每笔交易只能在单个聚合上运行的“规则”。

我还想知道我是否应该通过让每个聚合根保存它所依赖的聚合根的标识符来强制它们在域模型中的共享生命周期,即通过 require RestaurantaMenuId作为构造函数参数,同样对于MenuRestaurantId,这样就无法在没有另一个的情况下创建任何一个。然而,这仍然不会强制应用程序服务将它们保存在一起,因为它可以将它们全部创建在内存中,然后仅保存Menu,例如。

domain-driven-design

7
推荐指数
2
解决办法
2956
查看次数

在 .NET Core (MS.DI) 中注册具有类型约束的泛型类型

我有一个通用接口IPipelineBehavior<TRequest, TResponse>(来自 MediatR)。我正在尝试为此接口注册特定行为,如下所示:

services.AddTransient(typeof(IPipelineBehavior<,>),
    typeof(ValidationMiddleware<,>));
Run Code Online (Sandbox Code Playgroud)

ValidationMiddlewareIPipelineBehavior像这样实现:

public class ValidationMiddleware<TRequest, TResponse>
    : IPipelineBehavior<TRequest, Result<TResponse>>
Run Code Online (Sandbox Code Playgroud)

Result是一个自定义类,我希望所有 MediatR IRequestHandlers 返回。

当应用程序运行时,服务容器给出以下错误:

System.ArgumentException:实现类型“StudentManagement.App.Middleware.ValidationMiddleware 2[StudentManagement.App.Students.DisenrollStudentCommand,StudentManagement.App.Result1[System.Object]]”无法转换为服务类型“MediatR.IPipelineBehavior 2[StudentManagement.App.Students.DisenrollStudentCommand,StudentManagement.App.Result1[System.Object]]”

我不明白为什么,因为它们显然在运行时都具有相同的类型参数。我的猜测是,该Result<TResponse>位由于某种原因导致了错误,因为其他行为在刚刚实现时工作正常IPipelineBehavior<TRequest, TResponse>

有谁明白为什么我会收到此错误,以及我需要做什么来解决它?

.net c# asp.net dependency-injection mediatr

2
推荐指数
1
解决办法
1955
查看次数

url-loader / file-loader使用webpack打破CSS输出中的相对路径

我正在将Webpack与一些插件和加载程序结合使用,以获取src /文件夹并构建dist /文件夹。url-loader(当图像大于特定限制时回退到文件加载器)正在将它在我的html和scss文件中找到的图像输出到预期的正确目录。但是,它会更改那些文件中的相对路径,从而输出具有错误路径的css文件。

文件结构:

src/
    index.html
    assets/
        js/
            index.js
        scss/
            style.scss
        img/
            pic.jpg
            background.jpg

dist/
    index.html
    assets/
        js/
            index.js
        css/
            style.css
        img/
            pic.jpg
            background.jpg
Run Code Online (Sandbox Code Playgroud)

如您所见,我的dist /文件夹镜像了我的src /文件夹,除了scss被编译为css。

src / index.js导入index.html和style.scss,以便那些文件可以由webpack解析,并且其中的任何图像都可以由url-loader处理:

index.js

import '../../index.html';
import '../scss/style.scss';
Run Code Online (Sandbox Code Playgroud)

style.scss使用相对路径在主体上设置背景图像:

style.scss

body {
    background: url('../img/background.jpg');
}
Run Code Online (Sandbox Code Playgroud)

index.html只是使用相对路径显示图像:

index.html

<img src="./assets/img/pic.jpg" alt="pic">
Run Code Online (Sandbox Code Playgroud)

我使用HtmlWebpackPlugin在我的html文件中进行复制,因为它允许我指定要自动包含为脚本标记的块。对于CSS,我要么使用开发中的style-loader将其注入html文件,要么使用MiniCssExtractPlugin将其提取到生产环境中的自己的文件中。

但是,当webpack解析index.html和style.scss时,相对路径分别替换为'assets / img / pic.jpg'和'assets / img / backgorund.jpg'。这不会破坏index.html中的路径,因为它实际上是相同的相对路径,但这显然是style.css的问题。如何停止url-loader更改相对路径,或仅生成正确的路径?另请注意,在开发中使用样式加载器将css注入html时,该路径有效,因为该路径是相对于html文件的。理想情况下,webpack应该能够生成正确的相对路径,具体取决于我是在生产中提取css还是在开发中注入css。

我试过使用resolve-url-loader,指定publicPath和outputPath,当然也可以在线搜索答案,但是运气不佳。

webpack.config.js

const path = require('path');
const webpack = require('webpack');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');

const …
Run Code Online (Sandbox Code Playgroud)

css urlloader webpack sass-loader webpack-file-loader

1
推荐指数
3
解决办法
3497
查看次数