我想在AppDomains中使用一个对象.
为此,我可以使用[Serializeable]属性:
[Serializable]
class MyClass
{
public string GetSomeString() { return "someString" }
}
Run Code Online (Sandbox Code Playgroud)
或MarshalByRefObject的子类:
class MyClass: MarshalByRefObject
{
public string GetSomeString() { return "someString" }
}
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,我都可以使用这样的类:
AppDomain appDomain = AppDomain.CreateDomain("AppDomain");
MyClass myObject = (MyClass)appDomain.CreateInstanceAndUnwrap(
typeof(MyClass).Assembly.FullName,
typeof(MyClass).FullName);
Console.WriteLine(myObject.GetSomeString());
Run Code Online (Sandbox Code Playgroud)
为什么两种方法似乎都有相同的效果?两种方法有什么不同?我什么时候应该支持另一种方法呢?
编辑:从表面上看,我知道两种机制之间存在差异,但如果有人跳出丛林并问我这个问题,我无法给他一个正确的答案.问题是非常开放的问题.我希望有人可以比我能做的更好地解释它.
我已经准备好Mcconnell的" 代码完成 " 了一段时间.现在我在亨特和托马斯的" 实用程序员 "中再次阅读:使用断言!注意:我的意思是,不是单元测试断言Debug.Assert().
在SO问题之后什么时候应该使用Debug.Assert()?而当使用断言过例外领域类的断言是发展有用的,因为"不可能"的情况下,可以发现相当快.它们似乎很常用.据我理解的断言,在C#中,它们通常用于检查"不可能"值的输入变量.
为了尽可能简化和隔离单元测试,我用nulls和"不可能"的虚拟输入(如空字符串)来提供类和方法.
此类测试明确记录,它们不依赖于某些特定输入.注意:我正在练习Meszaros的"xUnit测试模式"描述为Minimal Fixture.
这就是重点:如果我有一个保护这些输入的断言,它们会炸毁我的单元测试.
我喜欢断言编程的想法,但另一方面我不需要强迫它.目前我想不出任何用途Debug.Assert().也许有一些我想念的东西?你有什么建议,他们真的有用吗?也许我只是高估了断言的用处?或者也许我的测试方式需要重新审视?
编辑:调试的最佳实践单元测试期间的断言非常相似,但它没有回答困扰我的问题:如果我Debug.Assert()按照我的描述进行测试,我是否应该关心C#?如果是的话,它们在哪种情况下真的有用?在我目前的观点中,这样的单元测试将Debug.Assert()没有必要.
另一点:如果你真的认为,这是一个重复的问题,只需发表一些评论.
在oracle中我可以指定列,这应该会触发触发器:
create or replace trigger my_trigger
before update of col1, col2, col3 on my_table for each row
begin
// the trigger code will be executed only if col1 or col2 or col3 was updated
end;
Run Code Online (Sandbox Code Playgroud)
现在我想要执行以下操作:当只更新一列时,我不希望触发器触发.这怎么可能?
我可以列出除一个列之外的所有列,这些列不应该触发触发器.对于包含许多列的表来说,这非常麻烦.
另一种方法是使用UPDATING函数,如下所示:
if not updating('COL3') then ...
Run Code Online (Sandbox Code Playgroud)
但是,如果我立刻更改了COL1 和 COL3,则该语句的计算结果为false.这不是我想要的,因为我只想更新一列(COL3)时限制执行.
在<Window.Resources>我定义了以下样式:
<Style x:Key="textBlockStyle" TargetType="TextBlock">
<Setter Property="Margin" Value="5,0,5,0"/>
</Style>
Run Code Online (Sandbox Code Playgroud)
我已经定义了一些网格,我有四个TextBlocks:
<WrapPanel>
<TextBlock Style="{StaticResource textBlockStyle}">Server</TextBlock>
<TextBlock Style="{StaticResource textBlockStyle}">IP</TextBlock>
<TextBlock Style="{StaticResource textBlockStyle}">Port</TextBlock>
<TextBlock Style="{StaticResource textBlockStyle}">Status</TextBlock>
</WrapPanel>
Run Code Online (Sandbox Code Playgroud)
问题:我需要参考textBlockStyle四次.
问题:是否可以在内部WrapPanel或其他地方设置该样式一次而不重复对样式的引用?
也许是这样的:
<WrapPanel Style="{StaticResource textBlockStyle}">
<TextBlock>Server</TextBlock>
<TextBlock>IP</TextBlock>
<TextBlock>Port</TextBlock>
<TextBlock>Status</TextBlock>
</WrapPanel>
Run Code Online (Sandbox Code Playgroud)
我不是在寻找全球解决方案!我可以删除该x:Key="textBlockStyle"属性,但这会影响窗口中的所有 属性TextBlocks.我需要一个更具选择性的机制,但没有那个丑陋的代码重复.
在读了福勒的"重构"一段时间之后,我仍然经常发现自己"我应该用更小的步骤做到这一点." - 即使我没有破坏我的代码.
小步骤重构是安全的,但成本时间.这是速度和风险之间的权衡 - 我试图在选择我的重构方式时具有战略性.
尽管如此:大多数时候我正在以更大的步骤进行重构.如果我参考福勒的"力学"部分并比较我的工作方式,我可能会发现我经常一步向前迈出两到五步.这并不意味着我是一名重构大师.我的代码可能会停留5到60分钟或者无法编译.
您是否以较小的步骤重构并尝试以较短的频率生成完整的代码?而且:你成功做到了这一点吗?
假设我有一些带有数据库的应用程序A. 现在我想添加另一个应用程序B,它应该跟踪应用程序A的数据库更改.应用程序B应该在数据发生变化时进行一些计算.两个应用程序之间没有直接通信.两者都只能看到数据库.
基本问题是:数据库中的某些数据发生了变化.如何触发一些C#代码在这些更改上做一些工作?
为了给出答案的一些刺激,我提到了一些我正在考虑的方法:
什么方法更有利?也许我已经错过了上述方法中的一些主要(dis)优势?也许还有其他一些我没有想到的方法?
编辑1:数据库独立性是...让我们称之为"销售人员"的一个因素.我可以使用SqlDependency或OracleDependency.对于DB2或其他数据库,我可以回退到轮询方法.这只是成本和收益的问题,我想至少考虑一下,以便我可以讨论它.
我想将部分源代码添加到XML文档中.我可以将源代码复制并粘贴到一些<code>元素中,如下所示:
/// <summary>
/// Says hello world in a very basic way:
/// <code>
/// System.Console.WriteLine("Hello World!");
/// System.Console.WriteLine("Press any key to exit.");
/// System.Console.ReadKey();
/// </code>
/// </summary>
static void Main()
{
System.Console.WriteLine("Hello World!");
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
保持这一点将是痛苦的.是否有其他可能性将源代码添加到C#中的XML文档中?
我正在使用Sandcastle处理XML文档,并希望从中提供技术帮助文件(*.chm).我想在该帮助文件中添加部件或完整的方法体.
编辑: 感谢slide_rule的评论.我添加了一个更现实,更简单的例子:
假设我有这样的方法:
public decimal CalculateFee(Bill bill)
{
if (bill.TotalSum < 5000) return 500;
else
{
if (bill.ContainsSpecialOffer) return bill.TotalSum * 0.01;
else return bill.TotalSum * 0.02;
}
}
Run Code Online (Sandbox Code Playgroud)
很高兴有可能将费用的计算方法添加到技术帮助文件中.
最明显的解决方案是将算法作为平淡无奇的文本写入评论中,如:"如果账单的总金额小于5000那么......".
另一种解决方案是将方法的主体复制并粘贴到注释字段中,并将其放入<code>元素中.即使没有太多关于C#的知识,也可以很容易地理解这个方法体 - 所以将它放入技术帮助文件中没有任何错误.
这两种解决方案都违反了DRY原则!我想将方法体或方法体的各个部分添加到帮助文件中,而不重复信息. …
对我来说,目前的答案是:不,我会使用iBatis,因为当数据库模型和对象模型不同步时,NHibernate很痛苦.如果我没有完全控制数据库,我最终会做很多工作.
我为什么这么问?
好吧,首先:我从未使用过NHibernate.我只是从表面上知道它.我已经了解了iBatis对旧数据库的优势.
第二:最近我与一个使用Hibernate的人进行了讨论(jep,在Hibernate之前没有'N').他告诉我,ORM框架现在非常先进并且提倡Hibernate.由于我对NHibernate不感兴趣,所以我没有跟踪最近的发展.
也许我是时候重新考虑我的答案了吗?
我们假设有一个C#程序,它用作Windows服务.让我们假设服务已经疯狂,并且像疯了一样消耗CPU和内存.它需要很快重新启动,因为它是一个生产系统.所以我没有太多时间收集运行时信息.也许快速浏览任务管理器......就是这样.
之后,我所拥有的只是log4net日志文件和用于事后分析的Windows事件日志.
假设我找到了问题的原因.其他人修复了它,也许程序员添加了一些额外的日志记录,所以我下次可以更快地找到类似的问题.尽管如此:我仍然依赖于日志文件的质量,并希望下次问题会以某种方式在记录中显示出来.
是否还有其他方法进行验尸分析?也许像线程转储(如java),内存转储或其他东西,这可能有助于事后分析?也许一些内置的.NET框架工具可以提供帮助吗?
我对真实的项目经验以及如何解决这个维护问题非常感兴趣,我认为这对大多数程序员来说都是非常真实的.
我有一个C#应用程序,它可以与Oracle数据库一起使用,并且已经发布.现在是时候发布新版本了.C#对象模型已经过修改,并对表结构产生了影响.
如果我发布新版本,我需要处理现有数据.只是删除表并重新创建这些表不会让任何客户满意.
为了解决这个问题,我收集了SQL脚本,它将先前发布的数据库结构改为新的数据库结构.在此过程中,数据也会迁移.SQL脚本被提交到C#源代码等存储库.在CruiseControl.NET的帮助下,定期测试数据库的修补程序.针对修补的数据库运行NUnit测试,以发现数据库表和C#对象模型之间的不匹配.
整个过程确实有效,但我觉得这可以做得更好.我认为数据库迁移非常关键.运送的应用程序无法使用错误修补的数据库,没有任何价值.丢失数据是不可接受的.这些恐怖场景可能会让我觉得根本不要改变数据库.因此,对我使用的工具和实践充满信心对我来说非常重要.
上周我偶然发现了LiquiBase,我问自己 - 现在在SO:
哪些工具或实践有助于以较低的风险和更大的信心进行数据库迁移?那里有好书或网络资源吗?
我对C#和Oracle的特定解决方案特别感兴趣,它可能适合我上面概述的开发过程.
假设您有以下课程:
class ProcessController
{
public List<Process> Active { get { ... } }
...
public List<Process> GetProcesses() { ... }
}
Run Code Online (Sandbox Code Playgroud)
我可以使用GetMethod绑定ObjectDataProvider到GetProcesses()方法:
<ObjectDataProvider x:Key="pList"
MethodName="GetProcesses"
ObjectType="{x:Type local:ProcessController}"/>
Run Code Online (Sandbox Code Playgroud)
我的问题是,我可以绑定到该属性Active吗?
如果发现我可以做以下事情:
<ObjectDataProvider x:Key="pList"
MethodName="get_Active"
ObjectType="{x:Type local:ProcessController}"/>
Run Code Online (Sandbox Code Playgroud)
但不知怎的,这感觉不对.
是否有一些更清晰的方式或"正确"的方式来访问属性而不是调用方法?
对于即将推出的项目,需要在旧版Oracle数据库周围编写C#代码.它将以数据为中心,因为大多数代码都会处理数据操作 - 几乎没有业务规则.所以我决定反对一个完整的ORM并选择Active Record方法.
我遇到两个选项:SubSonic和Castle ActiveRecord
谁有这两种实现的经验?当我在它们之间做出选择时,我应该考虑哪些因素?哪一个更稳定/更快/更容易使用/有一个良好的支持社区?
我很乐意得到一些决定指导.
subsonic nhibernate orm castle-activerecord subsonic-active-record