使用自动映射器通过Xamarin和C#将对象映射到领域对象

Fin*_*rog 5 realm automapper xamarin.ios xamarin

我正在创建一个Xamarin.iOS应用程序和一个Realm数据库。我想使我的POCO对象与我的对象分开,RealmObject所以我所做的是使用存储库模式,并且在存储库中我尝试使用AutoMapper将POCO映射到RealmObject

例如(子集)

public class PlaceRepository : IPlaceRepository
{
    private Realm _realm;

    public PlaceRepository(RealmConfiguration config)
    {
        _realm = Realm.GetInstance(config);
    }

    public void Add(Place place)
    {
        using (var trans = _realm.BeginWrite())
        {
            var placeRealm = _realm.CreateObject<PlaceRealm>();
            placeRealm = Mapper.Map<Place, PlaceRealm>(place);

            trans.Commit();
        }
    }
Run Code Online (Sandbox Code Playgroud)

因此,如果我调试代码,则所有内容都将映射为OK,并且将RealRealm填充为OK,但是当我提交时,任何内容都不会保存到Realm数据库中。以下是我的RealmObject

public class PlaceRealm : RealmObject
{
    [ObjectId]
    public string Guid { get; set; }
    public string Title { get; set; }
    public string Notes { get; set; }
 }
Run Code Online (Sandbox Code Playgroud)

这是我的POCO地方

public class Place
{
    public string Guid { get; set; }
    public string Title { get; set; }
    public string Notes { get; set; }
 }
Run Code Online (Sandbox Code Playgroud)

AutoMapper的初始化如下:

 Mapper.Initialize(cfg =>
 {
      cfg.CreateMap<Place, PlaceRealm>();
      cfg.CreateMap<PlaceRealm, Place>();
  });
Run Code Online (Sandbox Code Playgroud)

所有标准的东西。有没有其他人设法使类似的工作?

Dam*_*een 2

您的 poco“Place”称为“PlaceRealm”。我怀疑这是一个错字。(已编辑)

我怀疑 Automapper 正在实例化一个新对象,覆盖您原来的“placeRealm”对象。也许你可以尝试

Mapper.Map(place, placeRealm);
Run Code Online (Sandbox Code Playgroud)

代替您当前的映射。它应该只是将值复制到已经启动和跟踪的对象中。(不需要存储返回值)。

您可能还想明确要映射的属性 (3),因为当前 Automapper 将映射所有属性,包括基类中的属性。

另外,您可能会遇到 Automapper 的性能问题。我发现它是某些应用程序的性能瓶颈。ExpressMapper 是一个不错的选择。