Mỗi khi tôi tìm kiếm nội dung AutoMapper trên StackOverflow, tôi đang đọc một cái gì đó về ValueInjecter .
Ai đó có thể cho tôi biết những ưu và nhược điểm giữa chúng (hiệu suất, tính năng, sử dụng API, khả năng mở rộng, thử nghiệm) không?
Mỗi khi tôi tìm kiếm nội dung AutoMapper trên StackOverflow, tôi đang đọc một cái gì đó về ValueInjecter .
Ai đó có thể cho tôi biết những ưu và nhược điểm giữa chúng (hiệu suất, tính năng, sử dụng API, khả năng mở rộng, thử nghiệm) không?
Câu trả lời:
Là người tạo ra ValueInjecter , tôi có thể nói với bạn rằng tôi đã làm điều đó bởi vì tôi muốn một cái gì đó đơn giản và rất linh hoạt
Tôi thực sự không thích viết nhiều hoặc viết nhiều monkey code
như:
Prop1.Ignore, Prop2.Ignore etc.
CreateMap<Foo,Bar>(); CreateMap<Tomato, Potato>(); etc.
ValueInjecter giống như mozilla với các plugin của nó, bạn tạo ValueInjections và sử dụng chúng
có các mũi tiêm tích hợp để làm phẳng, không làm phẳng và một số được dự định sẽ được thừa kế
và nó hoạt động nhiều hơn theo kiểu khía cạnh , bạn không phải chỉ định tất cả các thuộc tính 1-1, thay vào đó bạn làm một cái gì đó như:
lấy tất cả các thuộc tính int từ nguồn có tên kết thúc bằng "Id", biến đổi giá trị và đặt từng thuộc tính vào một thuộc tính trong đối tượng nguồn có cùng tên mà không có hậu tố Id và kiểu này được kế thừa từ Thực thể, đại loại như thế
Vì vậy, một sự khác biệt rõ ràng, ValueInjecter được sử dụng ngay cả trong các hình thức cửa sổ với việc làm phẳng và không làm phẳng, đó là cách nó linh hoạt
(ánh xạ từ đối tượng để điều khiển biểu mẫu và trở lại)
Automapper, không thể sử dụng trong các hình thức cửa sổ, không bỏ qua, nhưng nó có những thứ tốt như ánh xạ bộ sưu tập, vì vậy trong trường hợp bạn cần nó với ValueInjecter, bạn chỉ cần làm một cái gì đó như:
foos.Select(o => new Bar().InjectFrom(o));
bạn cũng có thể sử dụng ValueInjecter để ánh xạ từ các đối tượng ẩn danh và động
sự khác biệt:
automapper tạo cấu hình cho từng khả năng ánh xạ CreateMap ()
valueinjecter tiêm từ bất kỳ đối tượng nào vào bất kỳ đối tượng nào (cũng có trường hợp khi bạn tiêm từ đối tượng sang valuetype)
automapper đã làm phẳng nó, và chỉ cho các loại đơn giản hoặc cùng loại, và nó không có kết cấu
valueinjecter chỉ khi bạn cần nó, bạn làm target.InjectFrom<FlatLoopValueInjection>(source); also <UnflatLoopValueInjection>
và nếu bạn muốn từ Foo.Bar.Name of type String
để FooBarName of type Class1
bạn kế thừa FlatLoopValueInjection và chỉ định này
automapper ánh xạ các thuộc tính có cùng tên theo mặc định và đối với phần còn lại, bạn phải chỉ định từng cái một và làm các công cụ như Prop1.Ignore (), Prop2.Ignore (), v.v.
valueinjecter có một mặc định tiêm .InjectFrom () thực hiện các thuộc tính có cùng tên và loại; đối với mọi thứ khác, bạn tạo các giá trị tùy chỉnh của mình với logic / quy tắc ánh xạ riêng lẻ, giống như các khía cạnh hơn, ví dụ: từ tất cả các đạo cụ của Type Foo đến tất cả các đạo cụ của loại Bar
<pedant>
Trông thật tuyệt, nhưng có lẽ nó phải là ValueInjectOr? </pedant>
Vì tôi chưa bao giờ sử dụng bất kỳ công cụ nào khác, tôi chỉ có thể nói về AutoMapper. Tôi đã có một vài mục tiêu trong việc xây dựng AutoMapper:
Nếu bạn muốn làm những điều này, AutoMapper hoạt động rất tốt cho bạn. Những điều AutoMapper không làm tốt là:
Lý do là tôi không bao giờ cần phải làm những điều này. Đối với hầu hết các phần, các thực thể của chúng tôi không có setters, không để lộ các bộ sưu tập, vv vì vậy đó là lý do tại sao nó không có ở đó. Chúng tôi sử dụng AutoMapper để làm phẳng các DTO và ánh xạ từ các mô hình UI để ra lệnh cho các thông báo và những thứ tương tự. Đó là nơi nó hoạt động thực sự, thực sự tốt cho chúng tôi.
Tôi đã thử cả hai và thích ValueInjecter vì nó rất đơn giản:
myObject.InjectFrom(otherObject);
Đó là tất cả những gì cần biết cho phần lớn nhu cầu tiêm của tôi. Nó không thể đơn giản và thanh lịch hơn thế này.
this object
Phương pháp mở rộng có?
InjectFrom()
phương thức mở rộng.
Đây là một câu hỏi tôi đã nghiên cứu quá, và đối với trường hợp sử dụng của tôi, nó dường như là người đánh giá cao. Nó không yêu cầu thiết lập trước để sử dụng (có thể đạt hiệu suất tôi đoán, mặc dù nếu được triển khai một cách thông minh, nó có thể lưu trữ ánh xạ cho các yêu cầu trong tương lai thay vì phản ánh mỗi lần), vì vậy bạn không cần phải xác định trước bất kỳ ánh xạ nào trước khi sử dụng chúng.
Quan trọng nhất, tuy nhiên, nó cho phép ánh xạ ngược. Bây giờ tôi có thể đang thiếu một cái gì đó ở đây vì Jimmy đề cập rằng anh ta thấy không có trường hợp sử dụng nào cần thiết, vì vậy có lẽ tôi đã nhầm mẫu, nhưng trường hợp sử dụng của tôi là tôi đang tạo một đối tượng ViewModel từ ORM của mình. Sau đó tôi hiển thị điều này trên trang web của tôi. Khi người dùng kết thúc, tôi lấy lại ViewModel dưới dạng một pppppost, làm thế nào để nó được chuyển đổi trở lại các lớp ORM ban đầu? Tôi muốn biết mô hình với automapper. Với ValueInjection, nó là tầm thường và thậm chí nó sẽ không được làm phẳng. ví dụ: Tạo một thực thể mới
Mô hình được tạo bởi entityframework (mô hình đầu tiên):
public partial class Family
{
public int Id { get; set; }
public string FamilyName { get; set; }
public virtual Address Address { get; set; }
}
public partial class Address
{
public int Id { get; set; }
public string Line1 { get; set; }
public string Line2 { get; set; }
public string TownCity { get; set; }
public string County { get; set; }
public string Postcode { get; set; }
public virtual Family Family { get; set; }
}
ViewModel (mà tôi có thể trang trí với trình xác nhận):
public class FamilyViewModel
{
public int Id { get; set; }
public string FamilyName { get; set; }
public int AddressId { get; set; }
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public string AddressTownCity { get; set; }
public string AddressCounty { get; set; }
public string AddressPostcode { get; set; }
}
ViewContoder:
//
// GET: /Family/Create
public ActionResult Create()
{
return View();
}
//
// POST: /Family/Create
[HttpPost]
public ActionResult Create(FamilyViewModel familyViewModel)
{
try
{
Family family = new Family();
family.InjectFrom<UnflatLoopValueInjection>(familyViewModel);
db.Families.Add(family);
db.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
Theo suy nghĩ của tôi, nó không đơn giản hơn thế nhiều sao?
(Vì vậy, điều này đặt ra câu hỏi, có gì sai với mẫu mà tôi gặp phải (và có vẻ như nhiều người khác làm vậy), rằng nó không được coi là có giá trị đối với AutoMapper?)
Tuy nhiên, nếu mẫu này là đã được đăng ký, là mẫu bạn muốn sử dụng, thì phiếu bầu của tôi là giá trị tính theo dặm quốc gia.