我总是以SOA类型的方式开发代码.今年我一直在努力做更多的DDD,但我一直觉得我没有得到它.在工作中,我们的系统是负载平衡的,并且设计为不具有状态.该架构是:
网站
===物理层==
主要服务
==物理层==
服务器1 /服务2 /服务3 /服务4
只有服务器1,服务2,服务3和服务4可以与数据库通信,主服务根据订购的产品调用正确的服务.每个物理层也是负载平衡的.
现在,当我开发一项新服务时,我尝试在该服务中考虑DDD,即使它并不真正感觉它适合.
我使用良好的DDD原则,如实体,值类型,存储库,聚合,工厂等.
我甚至尝试使用ORM,但他们似乎并不适合无状态架构.我知道有很多方法,例如使用IStatelessSession而不是NHibernate的ISession.但是,ORM只是觉得它们不适合无状态架构.
我注意到我真的只使用了DDD教给我的一些概念和模式,但整体架构仍然是SOA.
我开始认为DDD不适合大型系统,但我认为一些模式和概念确实适合大型系统.
就像我说的,也许我只是没有抓住DDD或者我可能不在分析我的设计?也许通过使用DDD告诉我的模式和概念我使用DDD?不确定这篇文章是否真的有问题,但在尝试找出DDD在整个系统中的适用位置以及它的真实可扩展性时,我有更多的想法.事实是,我认为我甚至不知道DDD是什么?
我正在使用Angular 2和ASP.NET Core Web API中内置的后端服务来构建Web应用程序。
对于身份验证,我正在考虑使用JWT令牌并将其存储在安全的HttpOnly Cookie中。
为了提高安全性,我还考虑在初次登录时以及初次登录后的每个请求中为用户捕获IP地址,如果IP地址更改,则吊销令牌。
所以我的问题是:
(响应一个答案)。
谢谢你回答我的问题。我已经回复了您的一些回复。
我最初的想法是,在cookie中使用JWT连接到API并不是典型的用例,为什么不使用标准MVC应用程序,但这不是您的问题,实际上,只要令牌是安全的,它同样安全在安全的httponly cookie中(当然实现是正确的)。我认为这有点不寻常。
我不确定您为什么考虑以这种方式使用Cookie异常?
是因为大多数时候cookie都用于会话状态吗?我个人认为,将令牌存储在安全的cookie中而不是将其保留在标http头或本地存储中应该是一个非常典型的用例,因为它的安全性更高。除非我想念什么?
因此,我想我会问这样做的缺点是什么?
这取决于。如果您担心会话被盗,可能是的。如果将令牌保存在httponly cookie中(针对xss进行了保护),则它比其他任何地方的令牌都更安全,但是,威胁模型仍可能显示不同的威胁并验证您的关注。通常的问题是您无法执行此操作,请参见下文。
该应用程序将处理许多PPI信息,因此我确实对令牌盗窃有所关注。
很有可能会有问题。这取决于您的用户,他们如何以及从何处使用您的应用程序。如果他们使用移动设备,则IP地址将发生很大变化,而这样的解决方案是不可能的。如果他们是公司内部网络中的公司用户,那将是可行的。它们之间是灰色区域。典型的家庭用户会不时更改其IP,大多数人会从其互联网提供商处获得动态IP分配。IP租约通常可持续数周(至少在我居住的地方),但是ISP可以根据需要配置它,可能需要一天甚至更短的时间。
我对IP地址租约续约的印象是,大多数情况下,客户端会获得相同的IP地址。但是,我不应该做出我认为的假设吗?
但是我可以看到,这对于移动设备来说可能是一个更大的问题。有些客户经常出差,所以这是您提出的一个好问题,可能会成为问题。
您可以选择执行的一种典型解决方案是在登录屏幕上提供此选项。如果用户选择使用IP地址验证,则他会选择更高的安全性,但会接受有时可能不得不再次登录的事实。或者,他可以选择较低的安全性,使其会话更稳定。我认为是否值得向您的用户解释这一点是一项商业决策。
从未考虑过给客户一个听起来不错的选择。
(响应一个答案)。
另外,我不确定您的JWT是否只有一个会话ID,或者您的服务器是否为无状态且所有会话数据都在JWT中。在第一种情况下,您甚至不需要JWT,您可以像往常一样传递会话ID,而标准的.Net MVC可以为您实现。如果它也是会话数据,则JWT默认情况下未加密,因此会话内容对于最终用户将是可见的,这可能是问题,也可能不是问题。(而且,JWT的签名受到保护,不会被篡改,因此它仅是关于机密性,而不是完整性)。根据您的目标浏览器,将会话数据存储在JWT中以及将JWT存储在cookie中也可能会遇到cookie大小问题。
我的后端ASP.NET Core Web API将是无状态的。已经做出使用决定,Angular因此讨论是有争议的。
至于为什么我认为以这种方式使用JWT有点不寻常:我认为JWT通常在需要将令牌传递到不同的URL(传递到不同的服务)时使用。为此,由于相同的原产地规则,httpOnly cookie显然不足。如果您负担得起使用httpOnly cookie的费用,则可以将会话信息存储在服务器端。
由于我的解决方案可能存在缺陷,我很想讨论上述主题,我认为可能会关闭这篇文章的话题吗?
提出针对上述主题的新问题也许更合适?
至于产生相同IP的租约续约:嗯,它们并不总是如此。这取决于您的业务情况,但是某些ISP仅在短时间内为您提供IP。如果您的用户偶尔可以注销,那么有线(家庭)用户也可以。对于移动设备,这绝对是一个大问题。
我一直在研究我的第一个Metro应用程序,我想将我的主题从默认的黑暗主题改为轻主题.如果您查看VS11和Blend中的平台窗格,看起来Metro有一些内置主题.我假设将主题从默认(黑暗)更改为Light会将系统画笔从黑暗变为浅色.它确实在设计师中起作用,但在运行程序时,一切都仍然很暗.
我是否做错了让系统画笔改变,或者我是否错过了平台主题的意义?或者它只是一个错误?
在typescript 2.4.0我尝试使用DefinePluginusing创建全局/环境变量webpack。所以这是我试图采取的方法:
webpack.js 定义部分
new webpack.DefinePlugin({
environment: JSON.stringify('DEVELOPMENT'),
}),
Run Code Online (Sandbox Code Playgroud)
globals.ts
declare const environment: String;
console.log(environment);
export { environment };
console.log(environment);
Run Code Online (Sandbox Code Playgroud)
环境服务.ts
import { IEnvironment } from 'environment';
import { environment } from '../globals';
console.log(environment);
export default class EnvironmentService implements IEnvironment {
environmentName: String = environment;
get isDevelopment(): boolean {
return this.environmentName === 'DEVELOPMENT';
}
get isProduction(): boolean {
return this.environmentName === 'PRODUCTION';
}
}
Run Code Online (Sandbox Code Playgroud)
在控制台日志中,我得到:
DEVELOPMENT
DEVELOPMENT
undefined
Run Code Online (Sandbox Code Playgroud)
所以当我期待的时候,console.log(environment);内心environmentService.ts给了我undefined …
我有一个关于DDD的问题.我正在构建一个学习DDD的应用程序,我有一个关于分层的问题.我有一个像这样工作的应用程序:
UI层调用=>应用层 - >域层 - >数据库
以下是代码外观的一个小示例:
//****************UI LAYER************************
//Uses Ioc to get the service from the factory.
//This factory would be in the MyApp.Infrastructure.dll
IImplementationFactory factory = new ImplementationFactory();
//Interface and implementation for Shopping Cart service would be in MyApp.ApplicationLayer.dll
IShoppingCartService service = factory.GetImplementationFactory<IShoppingCartService>();
//This is the UI layer,
//Calling into Application Layer
//to get the shopping cart for a user.
//Interface for IShoppingCart would be in MyApp.ApplicationLayer.dll
//and implementation for IShoppingCart would be in MyApp.Model.
IShoppingCart shoppingCart = …Run Code Online (Sandbox Code Playgroud) 我正在尝试用Gunicorn运行Flask应用程序.当我跑gunicorn app:index,我得到错误TypeError: index() takes 0 positional arguments but 2 were given.我见过的所有例子都没有显示index需要两个参数.这个错误是什么意思?如何使用Gunicorn运行Flask?
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return 'Hello, World!'
Run Code Online (Sandbox Code Playgroud)
gunicorn app:index
Run Code Online (Sandbox Code Playgroud)
respiter = self.wsgi(environ, resp.start_response)
TypeError: index() takes 0 positional arguments but 2 were given
Run Code Online (Sandbox Code Playgroud)
我改变index了两个参数,但得到了一个不同的错误.
@app.route("/")
def index(arg1, arg2):
return 'Hello, World!'
Run Code Online (Sandbox Code Playgroud)
/python3.4/site-packages/flask/templating.py, line 132, in render_template
ctx.app.update_template_context(context)
AttributeError: 'NoneType' object has no attribute 'app'
Run Code Online (Sandbox Code Playgroud) 一切安装没有任何错误.
我使用Visual Studio 11创建了一个新的Windows 8 Metro应用程序,在VS 11设计器中查看xaml没有任何问题.如果我在Blend For Visual Studio 11中查看它有错误的propup:
无法打开项目"TestApp.csproj".找不到导入的项目"C:\ Program Files(x86)\ MSBuild\Microsoft\WindowsXaml\v11\Microsoft.Windows.UI.Xaml.CSharp.Targets".确认声明中的路径是否正确,以及该文件是否存在于磁盘上.c:\ Users\testuser\Documents\Visual Studio 11\Projects\TestApp\testApp.csproj
此外,如果我在Blend For Visual Studio 11中创建Windows Metro风格项目(任何模板),它在完成后会显示一个空的解决方案.当我查看它想要创建它的目录时,我只看到项目文件但没有解决方案.
还有其他人有过这些问题吗?
现在唯一的问题是如何
- 评论1--
不,路径C:\ Program Files(x86)\ MSBuild\Microsoft\WindowsXaml**v11**\Microsoft.Windows.UI.Xaml.CSharp.Targets不存在.文件系统上的路径是C:\ Program Files(x86)\ MSBuild\Microsoft\WindowsXaml**v11.0**\Microsoft.Windows.UI.Xaml.CSharp.Targets
当我查看项目文件时,这就是我所看到的:
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' ">
<VisualStudioVersion>11.0</VisualStudioVersion>
</PropertyGroup>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets" />
Run Code Online (Sandbox Code Playgroud)
项目文件似乎告诉它正确的位置,所以我不确定为什么它试图查找错误的路径?
- 评论结束1--
我经常在我的机器上有大约3或4个目录,并希望能够轻松直接进入这些目录,而不是总是输入它们.
我能想到的最好方法是设置环境变量.但是,执行"cd env:"不起作用.
无论如何,有什么想法最好的方法来做到这一点?
*编辑1* 我希望我的会话结束时不会失去一种方法(例如,关闭PS窗口.).
我正在玩C++(自从我使用该语言已有10多年了)并编写了下面的小程序并对结果感到有些惊讶:
#include <iostream>
int& getReference()
{
int x = 33;
return x;
}
int main()
{
auto a = getReference() = 4;
auto b = getReference();
std::cout << "a: " << a << " b: " << b;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我期待"a:33 c:33"时输出为"a:4 c:33".
我期望"a"等于33的原因是因为我首先将getReference左值返回引用设置为4,而"return x"覆盖了带有33的左值引用.
无论如何,我想也许可以解释我在哪里错了?
谢谢大家的帮助!
编辑1 这么多回复真的很快.谢谢大家的帮助!
编辑2我不确定是否为时已晚,或者我应该将其作为一个新问题.我将"x"改为全局变量,得到了相同的答案.所以我现在仍然感到困惑,因为全局变量x并没有消失.
windows-8 ×2
architecture ×1
asp.net-core ×1
blend ×1
c++ ×1
c++11 ×1
cookies ×1
flask ×1
gunicorn ×1
javascript ×1
jwt ×1
node-sass ×1
powershell ×1
python ×1
sass ×1
security ×1
soa ×1
webpack ×1
yarnpkg ×1