-

   rss_rss_hh_new

 - e-mail

 

 -

 LiveInternet.ru:
: 17.03.2011
:
:
: 51

:


[ ] FlashMapper

, 29 2017 . 11:50 +
Birbone 11:50

FlashMapper

, . ?


, , , . 95, - . , , , .

FlashMapper, AutoMapper, .net-, . , .

, . , - , . - , , , , . FlashMapper , , .

, ?


. , , . . , -, , . , , .

, FlashMapper , , API , - . , , , .


, , , , .

public class UserForm
{
    public Guid? Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Town { get; set; }
    public string State { get; set; }
    public DateTime BirthDate { get; set; }
    public string Login { get; set; }
    public string Password { get; set; }
}


public class UserDb
{
    public Guid Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Town { get; set; }
    public string State { get; set; }
    public DateTime BirthDate { get; set; }
    public string Login { get; set; }
    public string PasswordHash { get; set; }
    public DateTime RegistrationTime { get; set; }
    public byte[] Timestamp { get; set; }
    public bool IsDeleted { get; set; }
}


:

public class FlashMapperInitializer : IInitializer //    FlashMapper'
{
    private readonly IMappingConfiguration mappingConfiguration; //  ,      
    private readonly IPasswordHashCalculator passwordHashCalculator;

    public FlashMapperInitializer(IMappingConfiguration mappingConfiguration, IPasswordHashCalculator passwordHashCalculator)
    {
        this.mappingConfiguration = mappingConfiguration;
    }

    public void Init() // ,      
    {
        mappingConfiguration.CreateMapping(u => new UserDb
        {
            Id = u.Id ?? Guid.NewGuid(),
            Login = u.Id.HasValue ? MappingOptions.Ignore() : u.Login,
            RegistrationTime = u.Id.HasValue ? MappingOptions.Ignore() : DateTime.Now,
            Timestamp = MappingOptions.Ignore(),
            IsDeleted = false,
            PasswordHash = passwordHashCalculator.Calculate(u.Password)
        });
        //mappingConfiguration.CreateMapping <...> (...); //  
    }
}

-. CreateMapping -, UserDb UserForm. , UserDb, . mappingConfiguration .

:

public class UserController : Controller
{
    private readonly IMappingConfiguration mappingConfiguration;
    private readonly IRepository usersRepository;

    public UserController(IMappingConfiguration mappingConfiguration, IRepository usersRepository)
    {
        this.mappingConfiguration = mappingConfiguration;
        this.usersRepository = usersRepository;
    }

    [HttpPost]
    public ActionResult Edit(UserForm model)
    {
        if (!ModelState.IsValid)
            return View(model);
        var existingUser = usersRepository.Find(model.Id);
        if (existingUser == null)
        {
            var newUser = mappingConfiguration.Convert(model).To();
            usersRepository.Add(newUser);
        }
        else
        {
            mappingConfiguration.MapData(model, existingUser);
            usersRepository.Update(existingUser);
        }
        return View(model);
    }
}


FlashMapper ( 15):

mappingConfiguration.CreateMapping((s1, s2, s3) => new Destination { ... });

, . FlashMapper , . , , CollisionBehavior = ChooseAny.

mappingConfiguration.CreateMapping((s1, s2, s3) => new Destination { ... }, o => o.CollisionBehavior(SelectSourceCollisionBehavior.ChooseAny));

, ChooseAny, , . , , .

API


FlashMapper . , , . , .

:

public interface IUserDbBuilder : IBuilder { }

public class UserDbBuilder : FlashMapperBuilder, IUserDbBuilder
{
    private readonly IPasswordHashCalculator passwordHashCalculator;

    public UserDbBuilder(IMappingConfiguration mappingConfiguration, IPasswordHashCalculator passwordHashCalculator) : base(mappingConfiguration)
    {
        this.passwordHashCalculator = passwordHashCalculator;
    }

    protected override void ConfigureMapping(IFlashMapperBuilderConfigurator configurator)
    {
        configurator.CreateMapping(u => new UserDb
        {
            Id = u.Id ?? Guid.NewGuid(),
            Login = u.Id.HasValue ? MappingOptions.Ignore() : u.Login,
            RegistrationTime = u.Id.HasValue ? MappingOptions.Ignore() : DateTime.Now,
            Timestamp = MappingOptions.Ignore(),
            IsDeleted = false,
            PasswordHash = passwordHashCalculator.Calculate(u.Password)
        });
    }
}

IUserDbBuilder UserDb Build(UserForm source) void MapData(UserForm source, UserDb destination). FlashMapperBuilder , void ConfigureMapping(IFlashMapperBuilderConfigurator configurator). mappingConfiguration. , generic- FlashMapperBuilder , UserDbBuilder.

. FlashMapperBuilder<> IFlashMapperBuilder, RegisterMapping, . UserDbBuilder IoC- IUserDbBuilder , IFlashMapperBuilder .

- Ninject
Kernel.Bind().To();


, extension-
public static IBindingWhenInNamedWithOrOnSyntax AsFlashMapperBuilder(
    this IBindingWhenInNamedWithOrOnSyntax builder) where T : IFlashMapperBuilder
{
    builder.Kernel.AddBinding(new Binding(typeof(IFlashMapperBuilder), builder.BindingConfiguration));
    return builder;
} 

:
Kernel.Bind().To().AsFlashMapperBuilder();


IFlashMapperBuildersRegistrationService, RegisterAllBuilders, . IFlashMapperBuilder, , RegisterMappings.

IUserDbBuilder
public class UserController : Controller
{
    private readonly IUserDbBuilder userDbBuilder;
    private readonly IRepository usersRepository;

    public UserController(IUserDbBuilder userDbBuilder, IRepository usersRepository)
    {
        this.userDbBuilder = userDbBuilder;
        this.usersRepository = usersRepository;
    }

    [HttpPost]
    public ActionResult Edit(UserForm model)
    {
        if (!ModelState.IsValid)
            return View(model);
        var existingUser = usersRepository.Find(model.Id);
        if (existingUser == null)
        {
            var newUser = userDbBuilder.Build(model);
            usersRepository.Add(newUser);
        }
        else
        {
            userDbBuilder.MapData(model, existingUser);
            usersRepository.Update(existingUser);
        }
        return View(model);
    }
}


. ConfigureMapping . -, passwordHashCalculator. -, , , . - (, , ), , , , . , , , .

, , CreateMapping, . , . , , . Build, .

- generic- FlashMapperBuilder . , late binding .

, 14.


, , 10 . , , - . , , IL- IL- , , , late binding , . .

, , , . , . , 72% JIT_MethodAccessCheck.

, . jithelpers.h , stackoverflow , -. stackoverflow , - CAS (code access security), -. , . , , , . , , .

dependency injection. , . , , . , , , .

, . -, stackoverflow API IL-. MethodBuilder, TypeBuilder . , , MethodBuilder CompileToMethod -. IL- , , . TypeBuilder, . , , , -. - Compile, , API. DynamicMethod. , IL- . , - , . , , JIT_ MethodAccessCheck .

, . , , TypeBuilder' , , , . stackoverflow, .

, FlashMapper AutoMapper 4 . 400 , 100 . , , .

image

, , , , -.


FlashMapper , , API .









Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/338968/

:  

: [1] []
 

:
: 

: ( )

:

  URL