小编Ste*_*unn的帖子

敏捷故事和任务

在设计后端系统时,您通常会为您的故事和任务提供什么样的粒度?

创建故事和任务的大多数示例通常以GUI应用程序为中心,故事是用户可以做的事情(例如,通过ISBN搜索书籍),每个任务都围绕启用此GUI功能.

在设计后端系统时,即没有用户界面但只是一堆服务与数据库,中间件等交谈的系统,您如何设计任务和故事?

agile extreme-programming

8
推荐指数
1
解决办法
4390
查看次数

WinInet如何确定缓存的内容和时间?

我正在尝试在我的.NET客户端和服务器之间进行缓存.在WinInet决定缓存结果之前,我看到一个看似随机的端点命中数.

.NET客户端使用HttpWebRequest以下命令发出请求

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uiTextBoxUrl.Text);
var policy = new RequestCachePolicy(RequestCacheLevel.CacheIfAvailable);
webRequest.CachePolicy = policy;
WebResponse webResponse = webRequest.GetResponse();
Run Code Online (Sandbox Code Playgroud)

使用ASP.net Web API实现的服务器设置以下CacheControl标头:

response.Headers.CacheControl = new CacheControlHeaderValue
        {
            MaxAge =3600,
            MustRevalidate = true,
            Public = true,
            Private = true
        };
Run Code Online (Sandbox Code Playgroud)

使用带有将请求发送到端点的按钮的测试工具,我可以看到,即使CacheIfAvailable使用了,也不会立即缓存响应.通过检查我的服务器上的调试输出,我发现在最终缓存请求之前需要触发看似随机数量的命中(或者更有可能是命中计数/经过时间启发式).如果我快速敲击测试按钮,它将在大约10次点击后开始缓存.如果我每隔1或2秒点击一次按钮,我就会计算最多25次点击,然后再进行缓存.

这是我从Fiddler看到的回应:

HTTP/200 responses are cacheable by default, unless Expires, Pragma, or Cache-Control headers are present and forbid caching.
HTTP/1.1 Cache-Control Header is present: …
Run Code Online (Sandbox Code Playgroud)

.net http wininet http-caching asp.net-web-api

8
推荐指数
1
解决办法
861
查看次数

如何在Splunk中转义值?

Splunk最佳实践说使用键/值对.它还表示如果值包含空格,则将值包装在引号中.所以,假设我有一个原始值Fred Smith:

my_key=name my_value="Fred Smith"
Run Code Online (Sandbox Code Playgroud)

没关系,我已经添加了引号.但是,如果我有一个原始值" Fred Smith"(注意已经存在的引号和开头存在空格)怎么办- 这会产生:

my_key=name my_value="" Fred Smith""
Run Code Online (Sandbox Code Playgroud)

这将被视为:

my_key=name my_value=""
my_key=Fred my_value=Smith""
Run Code Online (Sandbox Code Playgroud)

在Splunk值中转义引号的最佳做法是什么?

splunk

8
推荐指数
1
解决办法
8344
查看次数

ToString应该用于关键信息吗?

我刚刚遇到一些覆盖ToString()并返回一些关键信息(不仅仅是调试信息)的代码.此类用户调用ToString()并解析该关键数据.

我的意见,从多年来阅读各种各样的点点滴滴,是ToString()有一个相当弱的contract,即覆盖它(如果你想)显示一些有意义的东西.

看到我说那里的显示器?我遇到的代码依赖于此类实例的文本表示非常具体; 添加除预期之外的任何东西都会导致各种各样的问题.

所以,我的问题是,如果一个对象的文本表示是关键的,应该ToString()使用还是应该使用更明确的方法/属性,例如AsText

.net c# framework-design

6
推荐指数
2
解决办法
184
查看次数

验证我理解IoC,Ioc容器,DI和服务定位器之间的区别

阅读很多关于3个成语之间差异的帖子.但是更加困惑,然后我遇到了这篇文章:http: //martinfowler.com/articles/injection.html

只是想看看我是否做对了.如果我错了,请纠正我.请通知我更正和补充:

IoC-是将应用程序与其使用的服务的实现分离的概念.该应用程序包含对Iservice的引用,并不具备实现具体服务的能力.

至少有两种方法可以实现:

  1. DI - 具体服务作为ctor param注入/抛出一个setter/throw接口注入(后者是什么意思?)

  2. ServiceLocator - 是一个知道应用程序可能需要的所有具体服务的组件.应用程序明确要求定位器提供具体服务.

*IoC容器实际上是控件的工厂("提供者").

我对文章中的"何时更喜欢(1)或(2)"部分感到有些困惑.有人可以用外行的话说出自己的经历吗?

"服务定位器由于其更直接的行为而略有优势.但是,如果要构建要在多个应用程序中使用的类,那么依赖注入是更好的选择." - >定位器如何更直接?因为它显式使用方法调用?当有多个应用程序时,使用DI有什么好处?

dependency-injection ioc-container inversion-of-control service-locator

6
推荐指数
1
解决办法
1861
查看次数

如果dotCover没有报告足够高的结果,我怎么能失败TeamCity构建?

我希望TeamCity运行我的mSpec测试并报告测试所涵盖的代码.

如果某些命名空间中的代码覆盖率不满足阈值(例如,MyProduct.ImportantStuff必须是100%,但MyProduct.LegacyStuff必须是[ 23% 或当前为确保我们不添加新内容的任何内容],我还希望TeamCity报告构建失败没有覆盖测试的东西 ].

我最初看了dotCover,因为它已集成到TeamCity中.我一直在关注OpenCover,因为我无法让TC在低覆盖率上失败.

我得到了OpenCover的工作但我仍然想知道(因为我相信很多人会这样做)如果代码覆盖率太低,如何让TC失败.

teamcity code-coverage dotcover opencover

6
推荐指数
1
解决办法
1677
查看次数

使用RestSharp POST压缩JSON字符串的正确方法是什么?

我想在POST某个地方使用RestSharp .我直接发布JSON(而不是POCO).因为我发布了普通的JSON,我相信我需要使用这种解决方法而不是设置Body:

request.AddParameter(
    "application/json", myJsonString, ParameterType.RequestBody);
Run Code Online (Sandbox Code Playgroud)

当我没有压缩JSON时,这很好用.当我这样做时,使用这个:

request.Headers.Add("Content-Encoding", "gzip");
request.AddParameter(
    "application/json", 
     GZipStream.CompressString(myJsonString), 
     ParameterType.RequestBody);
Run Code Online (Sandbox Code Playgroud)

这不起作用.我逐步完成了代码RestClient::ConfigureHttp,我看到了:

http.RequestBody = body.Value.ToString();
Run Code Online (Sandbox Code Playgroud)

因为我给出了一个字节数组,body.Value所以设置为System.Byte[]

有没有办法让RestSharp在POST请求中处理gzip压缩的json字符串?

api rest http restsharp

6
推荐指数
0
解决办法
649
查看次数

为什么我的TypeScript有时会给我一个实例,有时候给我一个课程?

我正在编写一个应用程序来学习TypeScript.它在Chrome中运行良好,但在Edge中运行时遇到问题.我有这个方法:

 set position(pos: Point) {
        const diffAsPoint = pos.minus(this.canvasPos);

        let diff: Vector2D = diffAsPoint.toVector2D(); // <--- this line
        if (diff instanceof Vector2D) {
            console.info("is a vector!");
        } else {
            console.info("not a vector!");
        }
Run Code Online (Sandbox Code Playgroud)

我看到的是,有时,DIFF是一个Vector2D而不是作为一个实例一个Vector2D.显然,当发生这种情况时,对它的任何操作都会导致aObject doesn't support property or method ...

调试器显示类而不是实例

方法toVector2D很简单:

toVector2D(): Vector2D {
    return new Vector2D(this.x, this.y);
}
Run Code Online (Sandbox Code Playgroud)

我不知道这是否有所作为,但这里有一些背景知识:

  • 该应用程序是一个游戏循环运行的游戏(每秒60帧 - 使用window.requestAnimationFrame(() => this.animloop());)

  • 该应用在Chrome中正常运行

  • 它在IE中运行不正常(它看起来像一个不同的问题,但我还没有看到IE和调试工具在调查时崩溃)

  • 它使用最新的TypeScript(2.2.1)

  • 它似乎发生在启动后的一个随机点,有时是2秒,有时是3秒

  • 在代码中还有其他地方发生这种情况,所有这些都与PointVector2D在每一帧中创建它们有关(如果我引入一个字段而不是每帧创建一个字段,一些问题就会消失)

  • 我正在使用AMD和requirejs

更新-------

使用Edge和调试工具并设置"始终从服务器刷新",从网站(http://pacmanweb.azurewebsites.net/)加载时,我可以看到游戏 …

javascript html5-canvas typescript microsoft-edge

6
推荐指数
1
解决办法
92
查看次数

gRPC 推送和扇出

是否有可能使用 gRPC 作为具有扇出功能的推送服务?在Google给出的示例中,服务器端(C#)有以下代码:

    public override async Task ListFeatures(Rectangle request, IServerStreamWriter<Feature> responseStream, ServerCallContext context)
    {
        var responses = features.FindAll( (feature) => feature.Exists() && request.Contains(feature.Location) );
        foreach (var response in responses)
        {
            await responseStream.WriteAsync(response);
        }
    }
Run Code Online (Sandbox Code Playgroud)

问题就在这里:

  1. 仅当客户端明确要求时才会生成和写入数据。
  2. 只有提出请求的客户端才会获得新数据。

我想我需要的是:

  1. 保留每个请求(订阅)的客户端的所有 IServerStreamWriter。
  2. 当新数据可用时,通过外部事件触发写入。
  3. 写入所有streamWriter

编辑: 根据卡尔的建议,我现在有以下内容:

原型:

service PubSub {
 rpc Subscribe(Subscription) returns (stream Event) {}
 rpc Unsubscribe(Subscription) returns (Unsubscription) {}
}

message Event
{
   string Value = 1;
}
message Subscription
{
  string Id = 1;
}
message Unsubscription
{
  string …
Run Code Online (Sandbox Code Playgroud)

.net grpc

6
推荐指数
2
解决办法
7207
查看次数

如何发出HTTP请求并等待回调而不阻塞当前线程?

我们有一个使用基于HTTP API .NET应用程序,我们POST的请求向第三方HTTP端点(这不是我们的控制之下)和它在上,我们给它一个HTTP终结以后叫我们回 ; 就像是:

WebRequest request = WebRequest.Create(urlToMethod);
request.Method = @"POST";
request.Headers.Add(@"Callback", "http://ourserver?id="+id ); 
Run Code Online (Sandbox Code Playgroud)

我们成千上万的这些调用,所以我们希望尽可能有效(在速度/内存/线程等方面)

就回调代码而言,我们有一个充当监听器的类型; 这就是我们启动它的方式:

_httpListener = new HttpListener();
_httpListener.Prefixes.Add(ourServer);
_httpListener.Start();
_httpListener.BeginGetContext(callback, null);
Run Code Online (Sandbox Code Playgroud)

当服务器回调我们时,它会触及我们的callback方法,如下所示:

HttpListenerContext context = _httpListener.EndGetContext(result);

HttpListenerResponse httpListenerResponse = context.Response;
httpListenerResponse.StatusCode = 200;
httpListenerResponse.ContentLength64 = _acknowledgementBytes.Length;

var output = httpListenerResponse.OutputStream;
output.Write(_acknowledgementBytes, 0, _acknowledgementBytes.Length);

context.Response.Close();

var handler = ResponseReceived;

if (handler != null)
{
    handler(this, someData);
}
Run Code Online (Sandbox Code Playgroud)

因此,我们有一个这个侦听器的实例(_which内部使用HttpListener),并且对于它获得的每个响应,它都会通知ResponseReceived事件中的所有订阅者.

订阅者(可能是数百个)只关心与其特定关联的数据id …

.net c# asynchronous httplistener task-parallel-library

5
推荐指数
1
解决办法
1696
查看次数