小编Sch*_*999的帖子

IoC容器 - 单例还是传递实例?

可能重复:
创建单例来访问Unity容器或通过应用程序传递它是否更好?

我正在将IoC容器引入系统.自然的问题是,它应该是单例还是传递给类使用的实例?我倾向于将它作为单例实例,因为:

  1. 不需要像构造函数,附加属性那样混淆类定义.
  2. 更清晰 - 每个应用程序一个实例,一个初始化路由.
  3. 能够在必要时使用覆盖进行默认映射(例如单元测试).

以下是它的外观:

class Main
{
  public static void main(params string[] args)
  {
     IoCContaner.Intance.Add<IBar>();
     IoCContaner.Intance.Add<IBaz>();
     IoCContaner.Intance.Add<IQux>();

     var foo = new Foo();
     Foo.DoBarStuff();
  }
}

class Bar : IBar 
{ 
  public Bar(IBaz, IQuz) {} 
  public void DoBazStuff() { _baz.DoStuff(); }
}

class Foo
{
  public void DoBarStuff()
  {
     var bar = IoCContaner.Intance.Resolve<IBar>();
     bar.DoBazStuff();
  }
}
Run Code Online (Sandbox Code Playgroud)

有什么我想念的,而实际上我应该有这样的东西:

class Foo
{
  IoCContainer _c;
  public Foo(IoCContainer c) { _c = c; }
  ...
  private void DoBarStuff()
  {
     var …
Run Code Online (Sandbox Code Playgroud)

c# design-patterns dependency-injection ioc-container

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

代码合同 - 很好,在边缘,但尚未准备好黄金时间?

我对.NET 4中引入的代码契约感到非常着迷(尽管在DevLabs的帮助下).但是一个好的打印让我冷静下来.这是它说的:

  • 除了不使用它们之外,在线程安全方法中在锁定之外调用后置条件时,目前没有解决该问题的方法.
  • .NET依赖于二进制重写器,从而使构建更慢.
  • 使用代码契约也可能导致运行时性能损失.
  • 不能用于安全敏感的检查,因为它们可以在运行时通过处理ContractFailed事件来规避.

对我来说最大的是第一个.我不知道是否还有人编写单线程应用程序.因此,如果代码契约不能支持多线程,我看不到它们的用处.或者也许我不应该过分强调这一点,因为后置条件是用于断言方法本身的内部,可以进行单元测试.

顺便说一句,我还没有找到任何东西,我没有尝试反汇编我的代码,看看注入了哪些先决条件.我想在一个简单的方法中,当lock()首先出现时,在它之后立即注入检查很简单,但是在一个相当复杂的方法中,当锁定发生在中间的某个地方时,这可能是一个问题.或者,如果使用除lock()之外的其他一些机制.

c# multithreading .net-4.0 code-contracts

8
推荐指数
2
解决办法
3305
查看次数

由于XML节点的排序不正确,DataContract反序列化失败

我对DataContractSerializer的行为感到困惑.我们的配置基于XML.XML用作DataContractSerializer.ReadObject方法的源.最近,当没有设置反序列化对象的某些属性时,我遇到了一个问题.我已跟踪更改并发现这些属性已手动添加到XML中.在我看来哪个好.显然,在DataContractSerializer看来它不行,因为它似乎期望XML节点按字母顺序排序.真?!反序列化似乎非常简单 - 按顺序读取XML,解析节点名称,设置相应的属性.订购的目的是什么?

有解决方法吗?也许是DataContractSerializer的某种设置?

c# xml wcf datacontractserializer

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

.NET 4 Parallel.ForEach和PLINQ:他们可以压倒线程池并杀死应用程序性能吗?

我在代码中使用Parallel.ForEach和PLINQ越多,我得到的面孔和代码审查就越多.所以我想知道我有什么理由不在每个LINQ语句中使用极端的PLINQ吗?运行时是否能够足够聪明地开始产生如此多的线程(或者从线程池中消耗这么多线程),应用程序性能实际上会降低而不是改进?同样的问题适用于并行库.

我确实理解与线程安全和使用多线程的开销相关的含义.我也意识到并不是一切都有利于并行化.所有我想知道我是否应该停止捍卫我的方法,只是放弃这两个好东西,因为我的同行认为我最好自己做线程控制而不是依靠.NET设施?

更新:请假设硬件足以满足使用多线程的先决条件.

.net c# linq parallel-processing plinq

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

如果foreach是一个结构数组,它是否会复制每个元素?

我有一系列结构.foreach在通过数组进行迭代时,运算符是否会复制每个元素?据我所知foreach,只是引擎盖下的语法糖转换为for.所以似乎答案是肯定的,但我很乐意得到一些确认.

PS:似乎有人应该已经问过但我不能轻易找到任何东西.所以请以提供的参考形式投票.

.net c#

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

是否有Visual Studio 2010插件使用LINQ/XPATH查询XML文件?

有一个XML文件.我需要对它做一些统计(例如,有多少节点没有特定的属性,等等).我没有看到任何可以让我直接做到这一点的事情.有什么建议?我目前正在为Chrome使用XML Tree插件,但不仅仅是在VS之外,但它对我来说也不适用.

.net c# xml linq visual-studio-2010

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

如何强制Python字典缩小?

我在其他语言中经历过这种情况.现在我在Python中遇到了同样的问题.我有一个有很多CRUD动作的字典.可以假设从字典中删除元素应该减少它的内存占用.事实并非如此.一旦字典大小增加(通常加倍),它就永远不会(?)释放分配的内存.我运行了这个实验:

import random
import sys
import uuid

a= {}
for i in range(0, 100000):
    a[uuid.uuid4()] = uuid.uuid4()
    if i % 1000 == 0:
        print sys.getsizeof(a)

for i in range(0, 100000):
    e = random.choice(a.keys())
    del a[e]
    if i % 1000 == 0:
        print sys.getsizeof(a)

print len(a)
Run Code Online (Sandbox Code Playgroud)

第一个循环的最后一行是6291736.第二个循环的最后一行也是6291736如此.字典的大小是0.

那么如何解决这个问题呢?有没有办法强制释放内存?

PS:不需要随机做 - 我玩第二个循环的范围.

python dictionary garbage-collection memory-management

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

C#atomicity:在x64平台上分配int与long

我正在查看http://msdn.microsoft.com/en-us/library/aa691278(VS.71).aspx,其中说int的读写是原子的,而long的读写可能不是.64位平台真的如此吗?是不是IntPtr.Size == 64位还是长?我错过了什么或语言规格不够充实?

这里也有更多想法:http: //philosopherdeveloper.wordpress.com/2011/02/08/beware-assignment-atomic-assignment/

.net c# multithreading pointers thread-safety

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

Can Guice可以根据参数自动创建不同类的实例吗?

标准对象工厂可能如下所示:

interface I { ... }
class A implements I { ... }
class B implements I { ... }

class IFactory {
    I getI(int i) {
        switch (i) {
        case 1: return new A();
        default: return new B();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

是否可以设置绑定以便为我完成切换,即我所做的只是调用getInstance或者注入?我正在寻找辅助注射,但这似乎是不同的主题:https://code.google.com/p/google-guice/wiki/AssistedInject

java dependency-injection inversion-of-control guice

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

我可以在套件中运行单个测试吗?

我为我的struct设置了一个测试套件(https://github.com/stretchr/testify#suite-package).在我通过仅指定模式运行单个测试之前:

go test -v ./services/gateways/... -run mytest
Run Code Online (Sandbox Code Playgroud)

转换后此方法不起作用.运气不好或有办法吗?

go testify

5
推荐指数
2
解决办法
5506
查看次数