我正在尝试将 MassTransit 合并到一个也使用 NHibernate 的项目中。NHibernate 要求我至少有一个具有受保护内部可见性的默认构造函数。
我遇到了以下问题。可以毫无问题地发布消息,但是处理程序会收到带有未初始化成员的消息对象。经过一段时间对 MassTransit 源的调试和检查后,我发现这是由于 MassTransit 在反序列化期间使用设置 ConstructorHandling.AllowNonPublicDefaultConstructor 造成的,这导致调用我的受保护的内部默认构造函数而不是参数化构造函数。我设法重现了这种行为,请参见下面的代码。
MassTransit 使用 AllowNonPublicDefaultConstructor 的原因是什么,有什么方法可以改变这种行为?
class Program
{
public class TestClass
{
private readonly string _someString;
public string SomeString {
get { return _someString; }
}
public TestClass(string someString)
{
_someString = someString;
}
protected internal TestClass()
{
_someString = "uninitialized";
}
}
static void Main(string[] args)
{
var obj = new TestClass("Hello World");
var serializerSettings = new JsonSerializerSettings
{
ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor,
ContractResolver = new ... // MassTransit contract resolver that includes private setters
};
string serializedObject = JsonConvert.SerializeObject(obj, serializerSettings);
var deserializedObj = JsonConvert.DeserializeObject<TestClass>(serializedObject, serializerSettings);
// deserializedObj.SomeString == "uninitialized"
}
}