我的程序集中有很多入口点,我希望在运行此程序集中的任何其他代码之前,每个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#中创建多行字符串的最佳方法是什么?
我知道以下方法:
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)
看起来很丑,格式很糟糕.
如何在Autofac容器上注册全局回调,只要解析了任何对象,就会触发该回调?
我想使用反射并检查对象是否有一个被Initialize()调用的方法,如果有,则调用它.我希望它是鸭子类型,即不需要接口.
谢谢!
我使用标准的.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) 这个问题是关于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试图保护我不使用部分初始化的对象,但我希望将此保护作为一种选择,而不是义务.
问题:目前的行为是否令人遗憾?
是否可以在"虚拟"模式下使用TextBox.
当用户滚动文档时,我想按需提供文本.
我应该在Container中注册ViewModels并从那里解决?
优点:
缺点:
什么是正确的答案?我更愿意注册,如果我可以减轻终生缺点.
如果重要的话,我正在使用Caliburn和Autofac.
假设我想在编写任何其他代码之前遵循纯TDD即写单元测试.当我发现错误时,我必须编写单元测试来重现它然后实现修复.
假设我的应用程序中存在内存泄漏.我可以重现它 - 运行特定方法1,000,000,000次会导致OutOfMemoryException.此测试需要10秒才能失败.
长时间运行的单元测试通常不受欢迎,特别是当它们消耗大量内存时.此后,可能还有其他内存泄漏,因此可能会增加此类测试的数量.
那么如何解决这个错误的TDD方式呢?
我注意到我经常需要实现复合模式.例如:
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
可以改进吗?
在懒惰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 ×4
c# ×4
.net ×2
assemblies ×1
caliburn ×1
cdata ×1
lazy-loading ×1
memory-leaks ×1
multiline ×1
mvvm ×1
static ×1
string ×1
syntax ×1
tdd ×1
textbox ×1
unit-testing ×1
virtualmode ×1
wpf ×1