我知道,从基类的构造函数调用虚方法可能是危险的,因为子类可能不处于有效状态.(至少在C#中)
我的问题是如果虚拟方法是初始化对象状态的那个?它是很好的做法,还是应该是两个步骤,首先创建对象,然后加载状态?
第一个选项:(使用构造函数初始化状态)
public class BaseObject {
public BaseObject(XElement definition) {
this.LoadState(definition);
}
protected abstract LoadState(XElement definition);
}
Run Code Online (Sandbox Code Playgroud)
第二种选择:(使用两步法)
public class BaseObject {
public void LoadState(XElement definition) {
this.LoadStateCore(definition);
}
protected abstract LoadStateCore(XElement definition);
}
Run Code Online (Sandbox Code Playgroud)
在第一种方法中,代码的使用者可以使用一个语句创建和初始化对象:
// The base class will call the virtual method to load the state.
ChildObject o = new ChildObject(definition)
Run Code Online (Sandbox Code Playgroud)
在第二种方法中,消费者必须创建对象然后加载状态:
ChildObject o = new ChildObject();
o.LoadState(definition);
Run Code Online (Sandbox Code Playgroud) 在delphi 2009中,我引用了一个IInterface我想要转换为底层的东西TObject
使用TObject(IInterface)显然在Delphi 2009中不起作用(它应该在Delphi 2010中工作)
我的搜索引导我找到一个应该做的技巧,但它对我不起作用,当我尝试在返回的对象上调用方法时,我得到了AV.
我无法真正修改类,我知道这打破了OOP
当在.NET中的AppDomains之间封送对象时,CLR将序列化对象(如果它具有该Serializable属性),或者它将生成代理(如果它继承自MarshalByRef)
但是对于字符串,CLR只会将对字符串对象的引用传递给新的AppDomain.CLR仍然确保完整性,因为.NET字符串是不可变的,并且第二个AppDomain对字符串的任何更改都不会影响原始对象.
这让我想到了一个问题:有没有办法告诉CLR我的自定义类型是不可变的,当用于远程处理它应该只是传递对象的引用,就像它对字符串类一样?
好像我正在用这个打墙,没有太多关于此事的文件也无济于事.
我定期向CRM运行大型自定义导入作业,所有这些都涉及从自定义客户端调用组织服务以将记录推送到CRM.记录通过自定义沙盒插件.
导入需要相当长的时间,我正在尝试通过在多个服务器上设置沙盒处理服务来提高导入速度.
这是我到目前为止所尝试的:
使用沙盒处理服务添加另一台服务器.
/ Sandbox Processing Service (crmsb1)
Client > Front End (crm) <
\ Sandbox Processing Service (crmsb2)
Run Code Online (Sandbox Code Playgroud)
使用沙盒处理服务添加另一台服务器没有帮助.前端服务器没有将负载分配到两台服务器上,它继续使用原始服务器.仅当在第一个后端服务器上禁用沙盒处理服务时,第二个服务器才开始处理插件请求.(带回第一个在线没有帮助.)
两个具有所有角色的负载均衡服务器
/ Full Server (crm1)
Client > IIS ARR (crm) <
\ Full Server (crm2)
Run Code Online (Sandbox Code Playgroud)
我将本指南(以及许多其他人)写入了这封信,并让Web应用程序通过反向代理工作,但是通过组织服务执行请求失败了.通过不断更改另一个设置消除了无数的WCF错误后,我遇到了这个错误,The security context token is expired or is not valid. The message was not processed.让我认为负载平衡只适用于Web App.
在多台服务器上手动调用组织服务.
/ Full Server (crm1)
Client <
\ Full Server (crm2)
Run Code Online (Sandbox Code Playgroud)
我成功地设置了导入客户端,将导入作业拆分为多个块,并以循环方式同时为每个块调用所有组织服务端点.正如我所希望的那样,这大大加快了进口过程,并且如果需要的话,我还能够进一步扩展.
我阅读了有关此事的任何内容,但我仍然对CRM 2011中的负载均衡如何工作以及可能的配置感到困惑.
这两个 指南广泛使用了负载平衡,但它们没有详细描述它们如何设置.
在我上线之前,这些都是在测试环境中设置的.我为所有服务使用了域帐户,设置了正确的SPN,并且没有使用SSL.我在ARR中尝试使用和不使用Client Affinity(它适用于cookie,所以我假设WCF服务没有锁定到一个后端).
我的问题如下:
是否可以在主动/主动设置(负载平衡)中的多个服务器上设置沙箱处理服务本身(上面的1),还是仅支持主动/被动(HA)?
如果使用多个Sandbox处理服务实例的唯一方法是通过设置具有前端和后端角色的多个服务器(上面的2个),是否有任何方法可以为组织服务使用负载均衡器,如NLB或ARR …
我无法确定让delphi函数在.net的字节数组上运行的最佳方法.
delphi签名如下所示:
procedure Encrypt(
var Bytes: array of byte;
const BytesLength: Integer;
const Password: PAnsiChar); stdcall; export;
Run Code Online (Sandbox Code Playgroud)
C#代码如下所示:
[DllImport("Encrypt.dll",
CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Ansi)]
public static extern void Encrypt(
ref byte[] bytes,
int bytesLength,
string password);
Run Code Online (Sandbox Code Playgroud)
省略var和ref在字节数组声明之前似乎失败了,但它是否需要,因为我只更改数组的内容而不是数组本身?
另外,由于某些原因,我似乎无法在delphi中获取数组的长度,如果我删除BytesLength参数而Length(Bytes)不是工作,如果我添加BytesLength参数,Length(Bytes)开始工作但是BytesLength有一个错误的值.
我创建了一个单独的程序集来包含常见的扩展方法,扩展方法使用来自System.Web.dll(和其他)的类.
然后,当我创建一个引用Utilities.dll包含扩展方法的程序集的新项目(控制台应用程序)时,System.Web.dll如果它不使用扩展程序中任何类的扩展方法,则不需要添加对新项目的引用System.Web.dll(例如System.Web.UI.Control).
当其中一个扩展方法是通用方法时,一切都会按预期继续工作.但是,只要我将约束添加到将其约束到System.Web.dll程序集中的类的泛型方法,编译器就会抱怨我的新项目(控制台应用程序)需要引用,System.Web.dll即使新项目仍未使用该程序集中的任何内容.
换句话说,只要我对通用方法没有约束,一切都会编译,但只要我添加一个约束,编译器就会抱怨.
我的扩展方法汇编的一个例子(编译为库 Utilities.dll):
public static class StringExtensions
{
public static bool IsNullOrEmpty(this string value)
{
return string.IsNullOrEmpty(value);
}
}
public static class ControlExtensions
{
// If I remove the where clause it compiles
public static T FildChild<T>(this Control parent, string id)
where T : Control
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
And here is a new console application that won't compile (unless …
我正在对Medium Trust中的Linq查询进行自定义投影,我得到了一个MethodAccessException或者TypeAccessException抱怨反思和安全权利.
我已将代码简化为以下内容:
var anon1 = new { Name = "Bill Gates" };
var ctor = anon1.GetType().GetConstructors().First();
// With native Reflection it works
var anon2 = ctor.Invoke(new object[] { "Steve Ballmer" });
var expr = Expression.New(ctor, Expression.Constant("Scott Guthrie"));
var lamb = Expression.Lambda(expr); // This throws in Medium Trust
var anon3 = lamb.Compile().DynamicInvoke();
anon1.ToString(); // --> { Name = Bill Gates }
anon2.ToString(); // --> { Name = Steve Ballmer }
anon3.ToString(); // --> { Name = …Run Code Online (Sandbox Code Playgroud)