Я пытаюсь включить MassTransit в проект, который также использует NHibernate. NHibernate требует, чтобы у меня был по умолчанию конструктор с защищенной внутренней видимостью.Почему MassTransit использует конструкторHandling.AllowNonPublicDefaultConstructor для десериализации сообщений?
У меня возникла следующая проблема. Сообщения могут быть опубликованы без каких-либо проблем, однако обработчики получают объекты сообщений с неинициализированными членами. После некоторого периода отладки и проверки источников 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"
}
}
Причина, по которой я использую это частное поле для чтения только для открытого публичного свойства, заключается в том, что это мой предпочтительный (пуристический) способ определения неизменяемого объекта. – fstuijt
Несомненно. Перевести сообщение на объект домена, который имеет любую логику. Сообщения должны быть просто мешками с недвижимостью, больше ничего. У вас есть аргументация, и нет никакого способа изменить это с помощью сериализаторов по умолчанию. – Travis