小编Pet*_*ete的帖子

依赖注入(DI)"友好"库

我正在思考一个C#库的设计,它将有几个不同的高级函数.当然,这些高级功能将尽可能使用SOLID类设计原则来实现.因此,可能存在供消费者定期直接使用的类,以及作为那些更常见的"最终用户"类的依赖性的"支持类".

问题是,设计库的最佳方法是:

  • DI不可知 - 虽然为一个或两个常见的DI库(StructureMap,Ninject等)添加基本的"支持"似乎是合理的,但我希望消费者能够将该库与任何DI框架一起使用.
  • 非DI可用 - 如果库的使用者没有使用DI,那么库应该仍然尽可能容易使用,减少了用户为创建所有这些"不重要"的依赖关系而必须完成的工作量.他们想要使用的"真实"类.

我目前的想法是为常见的DI库提供一些"DI注册模块"(例如,一个StructureMap注册表,一个Ninject模块),以及一个非DI的集合或工厂类,并包含与这几个工厂的耦合.

思考?

c# dependency-injection inversion-of-control

227
推荐指数
2
解决办法
4万
查看次数

Jersey:默认缓存控制到无缓存

在编写RESTful Web服务时,如果我在客户端(当前是.NET胖客户端)上启用任何类型的缓存,我会遇到问题.默认情况下,Jersey不发送任何类型的缓存控制头,因此客户端会自动缓存大多数页面(这似乎是有效的行为).

我想让Jersey默认发送一个"no-cache"的缓存控件,然后特别是响应覆盖缓存控件.

有没有办法和泽西这样做?

我发现RESTeasy能够使用@NoCache注释来指定整个类的设置,但我没有找到与Jersey类似的东西.

java rest jax-rs jersey

20
推荐指数
3
解决办法
2万
查看次数

使用HATEOAS和Backbone.js

我已经开始尝试使用Backbone.js,并对Backbone.Model上url属性的文档文档感到震惊.

特别是,我正在构建一个使用HATEOAS/hypermedia来驱动客户端的REST API.

我可以看到Backbone为集合中的项目构建URL本身的默认行为的有用性,但对于我的情况,我更倾向于使用已解析的数据构建模型URL.

有没有人在Backbone上扩展/构建它来做到这一点?也许建立在像HAL这样的"标准"上?

编辑:

为了澄清,让我说我有以下内容:

获取/订单>>

[
  {
     "_links": {
       "self": "/orders/123"
     }
     "name": "Order #123",
     "date": "2012/02/23"
  },
  {
     "_links": {
       "self": "/orders/6666"
     }
     "name": "Order #666",
     "date": "2012/03/01"
  },
]
Run Code Online (Sandbox Code Playgroud)

我有一个订单模型,如:

var Order = Backbone.Model.extend({
});
Run Code Online (Sandbox Code Playgroud)

我希望该url属性能够自动退出HAL中的"self"引用.我认为创建一个新的基础模型(未经测试):

var HalModel = Backbone.Model.extend({
  url: function() {
    return get("_links").self;
  },
});
Run Code Online (Sandbox Code Playgroud)

思考?

rest hateoas backbone.js

12
推荐指数
2
解决办法
3244
查看次数

检测PrintDocument何时成功打印(不仅仅是预览)

我在我的应用程序中使用PrintDocument进行一些自定义打印.当我们的项目成功打印时,我需要记录.我最初通过以下方式实现了这一点:

 print_doc.EndPrint += (o,e) => printed_callback ();
Run Code Online (Sandbox Code Playgroud)

printed_callback打印完成后调用我的调用.但是,现在我正在添加预览支持,我PrintDocument将以完全相同的方式传递给PrintPreviewDialog.这样做会导致在EndPrint初始呈现预览所需的打印输出后调用事件.

因此,即使用户单击"预览"然后关闭预览,也会调用我们的日志记录代码.

有关如何区分真实打印输出和"预览打印"的任何建议?不幸的是,我不能只是因为用户可能会点击预览对话框中的"打印"按钮并触发打印输出EndPrintPrintDocument传递给PrintPreviewDialog用户.

.net c# printing winforms

11
推荐指数
1
解决办法
7214
查看次数

REST收集和单个项目的缓存注意事项

我正在开发一个新的REST-ful API,该API的主要/唯一使用者是智能/非Web浏览器客户端。我有一个由后台进程(而不是由客户端本身)维护/更新的集合资源。第一次迭代所需的唯一内容类型是JSON。URI类似于:

  • /items/ -代表项目集合的资源。
  • /items/123-代表ID为的单个项目的资源123

虽然客户端将不会创建新项目,也不会更新集合以添加/删除项目,但它将更新单个项目中的某些值。我的计划是使用我自己的JSON补丁格式,使用HTTP PATCH更新项目资源。

将有许多并发客户端读取项目,并同时更新不同的项目,并偶尔对同一项目进行并发更新,尽管允许一定程度的“最终一致性”,但我想将其设计为“缓存友好” “一种可能的方式。阅读RFC的PATCH,我发现对PATCH的成功响应后,如果有响应,则应使用响应更新Request-URI的缓存。问题归结为:

我要:

A)在/items/集合资源JSON 表示中包含各个项目的完整表示,然后将PATCH发送到/items/URI,并以补丁格式包括要更新的项目

优点:

  • 这使客户端不必N为了显示资源列表而执行请求数
  • 允许items客户端更新项目时使的所有缓存无效。

缺点:

  • 对我来说,这不是“干净”的东西,因为我并不是真正在更新收藏,而是单独更新商品。
  • 这会使整个集合的缓存无效,而不是使已更改的单个项目的缓存无效。

要么

B)在资源集合的JSON表示中,仅包括指向所包含项目的链接,并让客户端在发现集合中的哪些项目后请求各个项目。HTTP PATCH将发送到单个项目URI(例如/items/123

优点:

  • 独立地缓存集合和项目资源。单个项目的PATCH可以适当地使该项目的缓存无效。
  • API更加清晰,因为您在要更新的特定项目上发出了HTTP PATCH。

缺点:

  • 不允许批量更新商品。目前这根本不是必需的,我将来也不会预见,但是事后看来只有20到20岁。
  • 要求客户端发出N+1请求以显示项目的完整列表。

rest http-caching

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

构造函数+依赖注入

如果我正在编写一个包含多个构造函数参数的类,例如:

class A{
    public A(Dependency1 d1, Dependency2 d2, ...){}
}
Run Code Online (Sandbox Code Playgroud)

我通常会创建一个"参数持有者"类的类,如:

class AArgs{
    public Dependency1 d1 { get; private set; }
    public Dependency2 d2 { get; private set; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后:

class A{
    public A(AArgs args){}
}
Run Code Online (Sandbox Code Playgroud)

通常,使用DI容器我可以为依赖关系配置构造函数并解析它们,因此当构造函数需要更改时,影响最小.

这被认为是反模式和/或反对这样做的任何论据吗?

c# oop dependency-injection

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