Tôi đang sử dụng ServiceStack để tuần tự hóa và deserialize một số đối tượng thành JSON. Hãy xem xét ví dụ này:Nhận ServiceStack để giữ lại thông tin loại
public class Container
{
public Animal Animal { get; set; }
}
public class Animal
{
}
public class Dog : Animal
{
public void Speak() { Console.WriteLine("Woof!"); }
}
var container = new Container { Animal = new Dog() };
var json = JsonSerializer.SerializeToString(container);
var container2 = JsonSerializer.DeserializeFromString<Container>(json);
((Dog)container.Animal).Speak(); //Works
((Dog)container2.Animal).Speak(); //InvalidCastException
Dòng cuối cùng ném một InvalidCastException, vì trường Động vật được khởi tạo dưới dạng Loại động vật, không phải loại Dog. Có cách nào tôi có thể nói với ServiceStack để giữ lại thông tin rằng trường hợp cụ thể này là của loại Dog?
Việc cần làm trong trường hợp tôi có nhiều dịch vụ chủ yếu là cùng một DTO? Ví dụ: dịch vụ đăng ký người dùng và dịch vụ bảo trì người dùng? Cả hai đều mong đợi một DTO UserAccount với một số khác biệt trong đó các trường sẽ được điền vào. Kho lưu trữ đang mong đợi một tài khoản người dùng DTO vì nó sẽ chèn hoặc cập nhật bảng UserAccount. Vì vậy, tôi đã tạo một DTO tài khoản người dùng. DTO UserRegistration và UserMaintenance DTO kế thừa từ nó. [Cũng muốn thêm ở đây một lời cảm ơn lớn vì đã tạo ServiceStack.] – GeorgeBarker
Ugh ... để trả lời nhận xét/câu hỏi dường như rõ ràng của tôi: Thư không nên "là" đối tượng miền doanh nghiệp, nên "chứa" một (hoặc hơn). Một vấn đề đơn giản của "has" vs "is". Vì vậy, ví dụ của tôi, UpdateUserMsg và RegisterUserMsg sẽ chứa cả một DTO UserAccount. Không phải là một DTO tài khoản người dùng. Không cần thừa kế. – GeorgeBarker
Bạn sẽ xử lý danh sách mà không cần thừa kế như thế nào? Ví dụ, giả sử tôi có một DTO với thuộc tính 'List' và sau đó tôi có 20 lớp khác nhau triển khai 'IAnimal'. –
Cocowalla