粒度域事件

时间:2018-09-10 14:26:37

标签: .net-core domain-events

最初,我们使用Domain事件来处理与外部系统的通信。例如,每次用户更新其电话号码或姓名时,我们都会引发PhoneNumberUpdated和NameUpdated事件。然后,这些被处理程序捕获并发送到其他系统。

public static string Complaince_GetViolations(string clientId, string ruName, string clientSecret, string accessToken, ILog log)
{
var clientString = clientId + ":" + clientSecret;
//byte[] clientEncode = Encoding.UTF8.GetBytes(clientString);
//var credentials = "Basic " + System.Convert.ToBase64String(clientEncode);

byte[] clientEncode = Encoding.UTF8.GetBytes(accessToken);
var credentials = "Bearer " + System.Convert.ToBase64String(clientEncode);

var codeEncoded = System.Web.HttpUtility.UrlEncode(accessToken);

HttpWebRequest request = WebRequest.Create("https://api.ebay.com/sell/compliance/v1/listing_violation?compliance_type=PRODUCT_ADOPTION")   
as HttpWebRequest;

request.Method = "GET";
//  request.ContentType = "application/x-www-form-urlencoded";

//request.Headers.Add(HttpRequestHeader.Authorization, credentials);
//request.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + codeEncoded);
request.Headers.Add(HttpRequestHeader.Authorization, credentials);
//request.Headers.Add("Authorization", "Bearer " + codeEncoded);
request.Headers.Add("X-EBAY-C-MARKETPLACE-ID", "EBAY-US");


log.Debug("starting request.GetRequestStream");
string result = "";
var response = (HttpWebResponse)request.GetResponse();
using (var streamReader = new StreamReader(response.GetResponseStream())) //FAILS HERE
{
    result = streamReader.ReadToEnd();
}

//DO MORE STUFF BELOW
return "STUFF";
}

只要我们不需要“汇总”事件,它就很好用。例如,我们有一项新要求,要求我们在用户更新其姓名和/或电话号码时发送一封电子邮件。在当前结构下,我们的处理程序将收到多次通知(每次引发一次事件),这将导致发送多封电子邮件。

使我们的事件更具通用性似乎不是一个好的解决方案。但是,我们将如何汇总一次交易中引发的多个事件呢?

Thx 塞巴

1 个答案:

答案 0 :(得分:0)

我相信您的新要求与您的实际域是一个单独的问题。您的域会生成描述发生了什么事的事件。另一方面,用户通知是事件流到电子邮件形式的投影。就像您将读取模型要求与您的域分开一样,您也应该将其分开。

一个简单的解决方案是将您关心的事件捕获到一个表中,然后按计划每天一次,然后按总计发送一封电子邮件。