我正在阅读他的书" 网上依赖注入".
1)他在这里说Bastard Injection只有在我们使用时才会发生Foreign Default.
但在他的书中,第148页上的插图显示,Bastard Injection当依赖项的默认实现是Foreign Default或者Local Default:

那么当依赖的默认实现是一个时,Bastard Injection反模式也会出现Local Default吗?
2)在这里(以及他的书中)他指出,如果一个类有一个可选的依赖,那么这个依赖的默认实现是好的Local Default:
但在下一篇文章中,他似乎反对拥有可选的依赖项,即使默认实现是Local Default:
Run Code Online (Sandbox Code Playgroud)private readonly ILog log; public MyConsumer(ILog log) { this.log = log ??LogManager.GetLogger("My"); }就封装而言,这种方法的主要问题在于,看起来MyConsumer类无论是否控制其日志依赖的创建都无法真正决定.虽然这是一个简化的示例,但如果LogManager返回的ILog实例包装了一个非托管资源,这可能会成为问题,该资源应该在不再需要时处理掉.
当依赖的默认实现是本地的时,他在上面的摘录中的参数是否也有效?如果是这样,那么还应该避免使用具有本地默认值的可选依赖项?
3)Pg.147:
Bastard Injection的主要问题是它使用了FOREIGN DEFAULT ...,我们不能再自由地重用该类了,因为它拖拽了我们可能不想要的依赖.进行并行开发也变得更加困难,因为类很大程度上依赖于它的依赖性.
Foreign Default是一个依赖项的实现,它被用作默认值,并在与其使用者不同的程序集中定义.因此,对于Foreign Default,使用者的程序集也会依赖于依赖项的程序集.
他是否也暗示Foreign Default使并行开发更加困难,而Local Default则不然?如果他是,那么这没有意义,因为我认为使并行开发变得困难的原因并不是消费者的集合很难引用依赖的汇编,而是消费者阶层依赖于一个具体实现的事实.依赖?
谢谢
var user = UserManager.Find(...);
ClaimsIdentity identity = UserManager.CreateIdentity(
user, DefaultAuthenticationTypes.ApplicationCookie );
var claim1 = new Claim(
ClaimType = ClaimTypes.Country, ClaimValue = "Arctica", UserId = user.Id );
identity.AddClaim(claim1);
AuthenticationManager.SignIn(
new AuthenticationProperties { IsPersistent = true }, identity );
var claim2 = new Claim(
ClaimType = ClaimTypes.Country, ClaimValue = "Antartica", UserId = user.Id );
identity.AddClaim(claim2);
Run Code Online (Sandbox Code Playgroud)
这两个claim1和claim2跨请求仅针对时间坚持ClaimsIdentity用户登录.换句话说,当用户通过呼叫注销时SignOut(),两个声明也被删除,因此下次该用户登录时,它不再是这两个声明的成员(我假设这两个声明不再存在)
claim2跨越请求的事实(即使已经在添加到用户时创建了身份验证cookieclaim2)表明声明不会通过 …
通过设置AuthenticationProperties.IsPersistent为true,我们使身份验证cookie保持不变,因此用户在开始新会话时不必再次进行身份验证
CookieAuthenticationOptions.ExpireTimeSpans 控制cookie的有效期.
AuthenticationProperties.ExpiresUtc 设置身份验证的到期日期
a)我不确定" 认证的到期日期 " 是什么意思.也许上面的引用说ExpiresUtc控制用户再次被要求登录之前可以使用身份验证cookie进行身份验证多长时间?
b)如果我在a)中的假设是正确的,那么当ExpireUtc达到时,即使以下情况,cookie也将过期:
IsPersistent == true 和
会话尚未到期
cookie还没有超过设定的寿命ExpireTimeSpan?
c)如果IsPersistent设置为false,则会话到期后,即使以下情况,cookie也不再有效:
cookie尚未超过ExpireTimeSpan和设置的生命周期
身份验证尚未达到设定的生命周期ExpireUtc?
d)当cookie超过ExpireTimeSpan设置的生命周期时,即使以下情况,cookie也不再有效:
IsPersistent == true 和
会话尚未到期
身份验证尚未达到设定的生命周期ExpireUtc?
谢谢
如果我的Gmail帐户已禁用Access安全性较低的应用 ,则我的应用无法通过此帐户发送电子邮件.相反,我得到" SMTP服务器需要安全连接或客户端未经过身份验证.服务器响应是:5.5.1需要身份验证 "异常.
这里谷歌解释说,通过禁止 访问安全性较低的应用程序,只使用应用现代安全标准可以登录.
我的代码需要实现的现代安全标准是什么,您可以通过示例向我展示如何实现它们(不确定是否重要,但我的应用和Gmail帐户未使用两步验证)?
这是我目前使用的代码:
public class EmailService : IIdentityMessageService
{
public Task SendAsync(IdentityMessage message)
{
var credentialUserName = "myAccount@gmail.com";
var sentFrom = "myAccount@gmail.com";
var pwd = "myPwd";
System.Net.Mail.SmtpClient client =
new System.Net.Mail.SmtpClient("smtp.gmail.com");
client.Port = 587;
client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
System.Net.NetworkCredential credentials =
new System.Net.NetworkCredential(credentialUserName, pwd);
client.EnableSsl = true;
client.Credentials = credentials; …Run Code Online (Sandbox Code Playgroud) 我已经阅读了关于实体和价值对象之间差异的无数帖子,虽然我认为至少在概念上我理解这两者有何不同,但似乎在某些帖子中作者认为特定的域概念仅仅是因为它是不可变的(因此它的状态永远不会改变,至少在那个特定的领域模型中).
您是否同意如果对象的状态永远不会在特定域模型中更改,那么此对象永远不应该是实体?为什么?
谢谢
根据Evans的说法,在DDD中,我们有两种类型的工厂,一种用于创建对象,另一种用于重构存储的对象。
a)虽然Creation factories可以按聚合根的形式存在Standalone Factory objects或按Factory methods定义Reconstitution Factories存在,但应仅以Standalone Factory objects?形式存在?
b)我假设Reconstitution Factories应该仅由存储库使用/调用,这会将对象创建委托给它们?
c)即使它们仅由存储库使用,也应该Reconstitution Factories在中定义domain layer?
更新:
我的问题本质上只是理论上的,因为我才开始学习DDD
我假设您的对象保留在RDBMS中而不是oo db中。
是的,它们保留在关系数据库中
我认为它们是从数据库到域对象的简单数据转换(从结果集中获取字段并将其放在对象中,而无需任何验证或其他逻辑)
a)如果我正确理解您的意思,您是说,即使创建特定的对象足够复杂,无法为其使用creation factory对象,在大多数情况下,对同一对象的重构也不会像其创建那样复杂,因此不需要reconstitution factory?
b)您为什么要进行重构而不是创建那么复杂,是基于以下假设:存储在数据库中的对象已经处于有效状态?
数据映射对象应该在不同的层中。数据映射层对于域应该是未知的
我同意
C)
我将“重构工厂”视为数据映射器,它们应位于域之外。
但是根据Evans所说,工厂(我假设他是指创建工厂和重组工厂)正在处理领域概念(即,他们必须了解他们要创建/重新构造的实体或聚合的内部结构的某些知识),因此是域的一部分(即使它们不代表任何域概念),而数据映射器也不是域的一部分,也不了解对象的内部结构?
谢谢
从Pro异步编程与.Net:
Run Code Online (Sandbox Code Playgroud)for (int nTry = 0; nTry < 3; nTry++) { try { AttemptOperation(); break; } catch (OperationFailedException) { } Thread.Sleep(2000); }在休眠时,线程不会消耗任何基于CPU的资源,但线程处于活动状态的事实意味着它仍在消耗内存资源.在桌面应用程序上,这可能没什么大不了的,但是在服务器应用程序上,有大量线程处于休眠状态并不理想,因为如果更多工作到达服务器,它可能需要启动更多线程,增加内存压力并增加额外资源供操作系统管理.
理想情况下,您可以简单地放弃线程,而不是让线程进入休眠状态,从而允许线程自由地为其他请求提供服务.当您准备好再次继续使用CPU资源时,您可以获得一个线程(不一定是同一个线程)并继续处理.您可以通过不让线程进入休眠状态来解决此问题,而是使用等待在给定时间段内被视为已完成的任务.
Run Code Online (Sandbox Code Playgroud)for (int nTry = 0; nTry < 3; nTry++) { try { AttemptOperation(); break; } catch (OperationFailedException) { } await Task.Delay(2000); }
我不遵循作者的推理.虽然调用await Task.Delay会释放这个线程(正在处理请求),但是创建的任务Task.Delay也会占用一些其他线程来运行.那么这段代码真的能让服务器处理更多的同步请求,或者文本错误了吗?!
除了Remote Facade pattern更粗粒度的接口和客户端调用此接口是远程而不是本地之外,这两种模式之间是否还有其他差异?
谢谢