小编Kon*_*rin的帖子

整个程序集的静态构造函数

我的程序集中有很多入口点,我希望在运行此程序集中的任何其他代码之前,每个AppDomain执行一次初始化代码.最好的方法是什么?

我看到的一个解决方案是拥有一个带有静态构造函数的类,并继承我拥有的每个入口点.像这样的东西:

public class Initializer
{
    static Initializer()
    {
        EnsureInitialized();  // Calls initialization code once and only once
    }
}

public class EntryPointOne : Initializer, IEntryPoint
{
    // Some code here
}

public class EntryPointTwo : Initializer, IEntryPoint
{
    // Some code here
}

// etc.
Run Code Online (Sandbox Code Playgroud)

这让我可以避免在每个入口点编写样板静态构造函数,但是没有多继承,这并不总是可行的.你能想到其他更好的选择吗?

c# static assemblies initialization

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

创建多行字符串的最佳语法

在C#中创建多行字符串的最佳方法是什么?

我知道以下方法:

使用StringBuilder

var result = new StringBuilder().AppendLine("one").AppenLine("two").ToString()
Run Code Online (Sandbox Code Playgroud)

看起来太冗长了.

使用@

      var result = @"one
two"
Run Code Online (Sandbox Code Playgroud)

看起来很丑,格式很糟糕.

你知道更好的方法吗?

.net c# string syntax multiline

7
推荐指数
2
解决办法
8580
查看次数

Autofac - 对象解析时的全局回调

如何在Autofac容器上注册全局回调,只要解析了任何对象,就会触发该回调?

我想使用反射并检查对象是否有一个被Initialize()调用的方法,如果有,则调用它.我希望它是鸭子类型,即不需要接口.

谢谢!

autofac

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

.Net XmlSerializer:反序列化CDATA为内部文本

我使用标准的.Net XmlSerializer来解决CDATA反序列化问题.

更新:我从外部系统获取XML,我不能影响它的格式,所以我不能将CData包含在一个单独的属性元素中.

序列化给出了:

<?xml version="1.0" encoding="utf-16"?>
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><![CDATA[Hello, world!]]></MyClass>
Run Code Online (Sandbox Code Playgroud)

反序列化不会将对象恢复为原始状态.

这是正在序列化的类:

public class MyClass
{
    string _data;

    [XmlIgnore]
    public string Data
    {
        get { return _data; }
        set { _data = value; }
    }

    [XmlAnyElement]
    public XmlCDataSection CData
    {
        get { return new XmlDataDocument().CreateCDataSection(Data); }
        set { Data = value.Value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是失败的测试:

[Test]
public void CData_as_inner_text_test()
{
    MyClass item = new MyClass();

    item.Data = "Hello, world!";

    XmlSerializer serializer = new XmlSerializer(item.GetType());
    string serialized;

    using (StringWriter …
Run Code Online (Sandbox Code Playgroud)

.net c# xml-serialization cdata

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

依赖注入:注入部分初始化的对象

这个问题是关于Unity Container的,但我想它适用于任何依赖容器.

我有两个循环依赖的类:

class FirstClass
{
    [Dependency]
    public SecondClass Second { get; set; }
}

class SecondClass
{
    public readonly FirstClass First;

    public SecondClass(FirstClass first)
    {
        First = first;
    }
}
Run Code Online (Sandbox Code Playgroud)

从技术上讲,如果将它们视为单例,则可以实例化并正确地为它们注入依赖关系:

var firstObj = new FirstClass();
var secondObj = new SecondClass(firstObj);
firstObj.Second = secondObj;
Run Code Online (Sandbox Code Playgroud)

当我尝试对Unity做同样的事情时,我得到StackOverflowException:

var container = new UnityContainer();
container.RegisterType<FirstClass>(new ContainerControlledLifetimeManager());
container.RegisterType<SecondClass>(new ContainerControlledLifetimeManager());

var first = container.Resolve<FirstClass>(); // StackOverflowException here!
var second = container.Resolve<SecondClass>(); // StackOverflowException here too!
Run Code Online (Sandbox Code Playgroud)

我理解Unity试图保护我不使用部分初始化的对象,但我希望将此保护作为一种选择,而不是义务.

问题:目前的行为是否令人遗憾?

dependency-injection circular-dependency unity-container

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

"虚拟"模式下的WPF文本框

是否可以在"虚拟"模式下使用TextBox.

当用户滚动文档时,我想按需提供文本.

wpf textbox lazy-loading virtualmode

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

我应该在Container中注册ViewModels吗?

我应该在Container中注册ViewModels并从那里解决?

优点:

  1. 激活视图模型时,我可以执行一些操作
  2. Container会为我注入依赖项
  3. ???

缺点:

  1. ViewModel生命周期管理可能很棘手:
    • 如果我创建ViewModel单例,那么我无法实例化同一类型的几个控件
    • 如果我将ViewModel设置为瞬态,那么当我实际期望注入相同的实例时,我很容易就会遇到几个不同的实例
  2. ???

什么是正确的答案?我更愿意注册,如果我可以减轻终生缺点.

如果重要的话,我正在使用Caliburn和Autofac.

dependency-injection mvvm autofac caliburn

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

跟踪TDD时如何处理内存泄漏

假设我想在编写任何其他代码之前遵循纯TDD即写单元测试.当我发现错误时,我必须编写单元测试来重现它然后实现修复.

假设我的应用程序中存在内存泄漏.我可以重现它 - 运行特定方法1,000,000,000次会导致OutOfMemoryException.此测试需要10秒才能失败.

长时间运行的单元测试通常不受欢迎,特别是当它们消耗大量内存时.此后,可能还有其他内存泄漏,因此可能会增加此类测试的数量.

那么如何解决这个错误的TDD方式呢?

tdd unit-testing memory-leaks

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

Autofac复合图案

我注意到我经常需要实现复合模式.例如:

interface IService { ... }
class Service1 : IService { ... }
class Service2 : IService { ... }
class CompositeService : IService
{
    public CompositeService(IEnumerable<IService> services) { ... }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我想在容器中注册CompositeService作为IService并注入依赖项.

(看起来有点类似于装饰器,但装饰一组服务而不是一个)

在autofac中执行此操作的最佳方法是什么?

理想的解决方案将如何(对于C#)?

更新:

我目前的注册是:

builder.RegisterType<Service1>().Named<IService>("impl");
builder.RegisterType<Service2>().Named<IService>("impl");

builder.Register(c => new CompositeService(c.Resolve<IEnumerable<IService>>("impl")))
    .As<IService>();
Run Code Online (Sandbox Code Playgroud)

它类似于装饰手工http://nblumhardt.com/2011/01/decorator-support-in-autofac-2-4

可以改进吗?

c# autofac

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

Autofac lazy TypedParameter

在懒惰Autofac可能TypedParameter吗?更重要的是,我需要在注入参数时访问容器.代码可能如下所示:

builder.RegisterType<RootService>()
    .WithParameter(TypedParameter.From(c => c.Resolve<IChildService>(key)));
Run Code Online (Sandbox Code Playgroud)

更新

基于Nick的回答,我创建了以下帮助方法:

public static class TypedResolvedParameter 
{
    public static ResolvedParameter From<T>(Func<IComponentContext, T> factory)
    {
        return new ResolvedParameter(
            (pi, c) => pi.ParameterType == typeof(T),
            (pi, c) => factory(c));
    }
}
Run Code Online (Sandbox Code Playgroud)

autofac

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