Autofac有模块,Windsor有安装程序和StructureMap注册表...使用Simple Injector如何将配置逻辑打包成可重用的类?
我试过了:
public interface IModule { }
public class FooModule : IModule
{
public FooModule(SimpleInjector.Container container)
{
container.RegisterSingleton<IBar, Bar>();
container.RegisterSingleton<IFoo, Foo>();
}
}
Run Code Online (Sandbox Code Playgroud)
我在Composition Root中使用它:
public static void Main(string[] args)
{
var container = new SimpleInjector.Container();
container.RegisterCollection<IModule>(new FooModule(container));
...
}
Run Code Online (Sandbox Code Playgroud)
但是,FooModule取决于容器,可能不是一个好的做法...请参阅http://code.google.com/p/autofac/wiki/BestPractices:
如果组件依赖于容器,请查看它们如何使用容器来检索服务,并将这些服务添加到组件(依赖注入)构造函数参数中.
我有这个简单的C#程序:
using Npgsql;
public class App {
public static void Main(string[] args) {
const string CONNECTION_STRING = "Host=myserver;Username=mylogin;Password=mypass;Database=mydatabase";
using (var conn = new NpgsqlConnection(CONNECTION_STRING)) {
conn.Open();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我用mono(mcs)编译它:
mcs -target:exe -lib:bin -r:System.Data.dll -r:Npgsql.dll -r:System.dll -r:Mono.Security.dll -out:bin/ssl.exe src/App.cs
Run Code Online (Sandbox Code Playgroud)
当我执行时,抛出一个错误:
Unhandled Exception:
System.TypeLoadException: Could not load type 'System.Net.Security.SslStream' from assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
at Npgsql.NpgsqlConnector.Open () <0x4155f7f0 + 0x00115> in <filename unknown>:0
at Npgsql.NpgsqlConnectorPool.GetPooledConnector (Npgsql.NpgsqlConnection Connection) <0x4155c8d0 + 0x00a4f> in <filename unknown>:0
[ERROR] FATAL UNHANDLED EXCEPTION: System.TypeLoadException: Could not …Run Code Online (Sandbox Code Playgroud) ANTLR是一个很棒的软件,但是,在我看来,对于C#程序员来说有点不舒服(C#移植已经过时,解析器antlr-3.1.3.jar需要java等)我正在寻找对于"更多C#native"语言工具来解析一个简单的类似json的语法,有什么建议吗?
我想使用模拟对象编写单元测试,比如C# 的Moq或NSubstitute。有人可以推荐一个与 Vala 一起使用的模拟库吗?
using NUF = NUnit.Framework;
[NUF.Test]public void DifferentCastingTest() {
NUF.Assert.That((int)0.499999D, NUF.Is.EqualTo(0));
NUF.Assert.That((int)0.500000D, NUF.Is.EqualTo(0)); // !!! row 1
NUF.Assert.That((int)1.499999D, NUF.Is.EqualTo(1));
NUF.Assert.That((int)1.500000D, NUF.Is.EqualTo(1)); // !!! row 2
NUF.Assert.That(System.Convert.ToInt32(0.499999D), NUF.Is.EqualTo(0));
NUF.Assert.That(System.Convert.ToInt32(0.500000D), NUF.Is.EqualTo(0)); // !!!
NUF.Assert.That(System.Convert.ToInt32(1.499999D), NUF.Is.EqualTo(1));
NUF.Assert.That(System.Convert.ToInt32(1.500000D), NUF.Is.EqualTo(2)); //!!! row 3
}
Run Code Online (Sandbox Code Playgroud)
通过转换和Convert.ToInt32(参见第2行和第3行)以不同方式转换相同的double值(1.5D),并且在不同模式下舍入两个具有相同尾数(0.5和1.5)的double(参见第1行和第2行) .这是一个错误吗?
我实际上在使用Vala/Tutorial网站上宣传的关于输出参数声明的看似很好的功能时遇到了问题.
这里的引用来自:https://live.gnome.org/Vala/Tutorial#Parameter_Directions
以下是如何实现method_1()的示例:
void method_1(int a, out int b, ref int c) {
b = a + c;
c = 3; }
Run Code Online (Sandbox Code Playgroud)
将值设置为out参数"b"时,Vala将确保"b"不为空.因此,如果您对此值不感兴趣,则可以安全地传递null作为method_1()的第二个参数.
看一下生成的C代码,很明显,与上面提出的声明相矛盾,而不是在赋值之前进行检查,而是可以很好地取消引用可能的NULL指针.
void method_1 (gint a, gint* b, gint* c) {
*b = a + (*c);
*c = 3;
}
Run Code Online (Sandbox Code Playgroud)
我期望的代码将采用这种形式:
void method_1 (gint a, gint* b, gint* c) {
if (b != NULL)
*b = a + (*c);
*c = 3;
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我发现的唯一解决方法是抛弃整个参数声明,直接用指针代替.
void method_1 (gint a, int* b, ref int c) { …Run Code Online (Sandbox Code Playgroud) 我编写了读取网络流并将数据存储到字节数组中的代码,然后将该字节数组转换为字符串数组.
我想从字符串数组中删除不可打印的ASCII字符(代码28即文件分隔符)或直接从字节数组中删除.
我怎样才能实现同样的目标?
我试过以下代码:
saBytesReceived = saBytesReceived.Select(s => s.Replace(@"[^U+001C]", "")).ToArray();
Run Code Online (Sandbox Code Playgroud)
代码: -
if (serverSocket.Connected)
{
bBytesToRead = serverSocket.Available;
if (bBytesToRead > 0)
{
try
{
bDataReceived = new byte[bBytesToRead];
networkStream.Read(bDataReceived, 0, bBytesToRead);
try
{
if (System.Text.ASCIIEncoding.ASCII.GetString(bDataReceived).Trim() != "")
{
uncompletedMessage.IdleCount = 0;
saBytesReceived = System.Text.ASCIIEncoding.ASCII.GetString(bDataReceived).Split(new string[] { "\n" }, StringSplitOptions.None);
saBytesReceived = saBytesReceived.Select(s => s.Replace(@"[^U+001C]", "")).ToArray();
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我想知道这样的事情是否可能。我正在使用 redis 列表,想知道是否可以将一个项目从列表中间移动到列表顶部,如下所示:
LPUSH mylist "This"
LPUSH mylist "is"
LPUSH mylist "a"
LPUSH mylist "Test"
Somehow Move "a" to top
LRANGE mylist
1. "a"
2. "This"
3. "Is"
4."Test"
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助!