作为这个问题的后续问题,我已经在我的本地机器上运行了一个解决方案,但是没有在网络上的机器上运行.
我不太了解那些基础知识以外的插座,所以请耐心等待.目标是让客户端在本地网络上查找服务器,这是一些剪切/粘贴/编辑代码的结果.
这是客户端代码:
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10294);
byte[] data = new byte[1024];
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 10);
string welcome = "What's your IP?";
data = Encoding.ASCII.GetBytes(welcome);
client.SendTo(data, data.Length, SocketFlags.None, ipep);
IPEndPoint server = new IPEndPoint(IPAddress.Any, 0);
EndPoint tmpRemote = (EndPoint)server;
data = new byte[1024];
int recv = client.ReceiveFrom(data, ref tmpRemote);
this.IP.Text = ((IPEndPoint)tmpRemote).Address.ToString(); //set textbox
this.Port.Text = …Run Code Online (Sandbox Code Playgroud) 我无法弄清楚如何在我的模型中添加一堆UI特定的东西,如INotifyProperyChanged和INotifyCollectionChanged,或者创建大量不同的事件并做一些感觉的事情,让视图模型得到模型更改的通知就像他们是UI特定的,应该远离模型.
否则,我只需要复制视图模型中的所有业务逻辑,以确保一切都是最新的,那么拥有模型的重点是什么呢?
我在模型中遇到的一个棘手的问题是"类别"类的属性.您可以将其视为树结构,属性是所有叶节点后代.在模型中,属性是通过递归方式生成所有它的子项,这一切都很好.但是视图模型需要绑定到该属性,并且需要知道它何时发生更改.我应该更改模型以适应视图模型吗?如果我这样做,那么视图模型此时并没有真正做任何事情,模型会引发所有必要的更改通知,视图可以直接绑定到模型.此外,如果模型是我没有源的东西,我将如何解决这个问题?
我认为使用与接口相同的命名空间中的扩展方法,您可以获得与多继承类似的效果,因为您不需要在10个不同的类中以相同的方式实现相同的接口的重复代码.
这样做的一些缺点是什么?我认为专业人士非常明显,这是后来通常会再次咬你的缺点.
我看到的一个缺点是扩展方法不能是虚拟的,因此您需要确保实际上确实希望它们以相同的方式实现每个实例.
在我们的代码中的几个地方,我们注意到如果在调试器下运行,它将显示代码中存在未处理的异常,但是如果在调试器外部运行它将完全忽略异常,就好像它被捕获一样.我们有一个异常处理程序,它弹出一个连接到Application.ThreadException和AppDomain.CurrentDomain.UnhandledException的错误提交对话框.这些都不会捕获它们.我们还记录了我们的异常,日志中没有任何内容.
这有什么可能的原因?
编辑:似乎它不依赖于异常抛出的类型,而是它抛出的位置.仅通过添加以下测试:
throw new Exception("Test Exception");
Run Code Online (Sandbox Code Playgroud)
它将显示在调试器下但不会显示在外部,因此在我们的示例中,它不是ThreadAbortedException或任何依赖于它的特定类型的异常.
我有代表文件夹的对象,我想知道它们是否应该在数据库中表示.
一方面,似乎最简单的方法是不表示文件夹对象,只存储文件夹中包含的对象的路径值.我看到的问题是你不能保留一个后代不包含任何项目的文件夹,这不是什么大不了的事.此外,我还没有清楚地知道如何加载文件夹层次结构以显示(例如在TreeView中)而不将所有内容加载到内存中,这可能是性能问题.
另一种方法是使用一个"文件夹"表,其中包含对其父文件夹的引用.这似乎应该可行,但我不确定如何允许具有相同名称的文件夹,只要它们不共享父级.这甚至应该是DB应该关注的事情,还是我应该在业务逻辑中执行的事情?
场景是我有一个应用程序相对url,如"〜/ path/to/page.aspx?query = string".我需要以编程方式创建对该页面的Web请求并且当前正在使用WebRequest.Create.问题是WebRequest.Create需要一个完全限定的URL,包括协议/域/端口等.
我可以访问当前的Request.Url对象,但似乎没有一种简单的方法可以获得保持协议(HTTP与HTTPS)的基本URL以及任何端口号以及应用程序的路径.
我的意思是那里的所有信息,所以如果需要我可以只采取所有部分并将它们结合起来,但似乎它可能容易出错,并且内置一些经过充分测试以完成工作的内容会很棒. Page.ResolveUrl让我几乎到了那里,但它缺少协议和域/端口.
我有以下测试
[Test]
public void Attack_TargetWith3Damage_CausesAttackerToDeal3DamageToTarget()
{
var realAttacker = CreateCreature(damage: 3);
var wrappedAttacker = A.Fake<ICreature>(x => x.Wrapping(realAttacker));
var target = A.Fake<ICreature>();
wrappedAttacker.Attack(target);
A.CallTo(() => wrappedAttacker.DealDamage(target, 3)).MustHaveHappened();
}
Run Code Online (Sandbox Code Playgroud)
问题是,该呼叫DealDamage从Attack方法没有被注册,因为该方法中,this是realAttacker不是wrappedAttacker攻击者因此调用该方法不被拦截.
我该如何测试这个断言?可以用FakeItEasy完成吗?是否有一个不同的模拟框架允许我测试它?
function getPerformActionFunction(someParameter) {
return function() {
performAction(someParameter);
}
}
Run Code Online (Sandbox Code Playgroud)
你会问什么getPerformActionFunction表明它不执行动作,而是返回执行动作的函数?
示例是Javascript,如果有一个首选的Javascript约定,但如果答案不同,也对其他语言感兴趣.
我必须忘记,因为我的单元测试失败,因为以下代码抛出了null ref异常:
int pid = 0;
if (parentCategory != null)
{
Console.WriteLine(parentCategory.Id);
pid = parentCategory.Id;
}
Run Code Online (Sandbox Code Playgroud)
投掷它的线是:
pid = parentCategory.Id;
Run Code Online (Sandbox Code Playgroud)
console.writeline只是在NUnit GUI中调试,但输出有效的int.
编辑:它是单线程的,因此无法从其他某个线程分配为null,而Console.WriteLine成功打印出该值的事实表明它不应该抛出.
编辑: Category类的相关片段:
public class Category
{
private readonly int id;
public Category(Category parent, int id)
{
Parent = parent;
parent.PerformIfNotNull(() => parent.subcategories.AddIfNew(this));
Name = string.Empty;
this.id = id;
}
public int Id
{
get { return id; }
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,如果有人想查看完整的代码,请访问http://code.google.com/p/chefbook/source/checkout上的Google Code
我想我会尝试重新启动计算机...我已经看到通过重启修复了很奇怪的事情.重启后会更新.
更新:神秘解决了.看起来NUnit将错误行显示为最后成功执行的语句...将复制/粘贴测试复制到新控制台应用程序并在VS中运行显示它是包含空引用的if语句块(未显示)之后的行.感谢大家的所有想法.给每个回答的人+1.