/ / Autofac 3 i Automapper - automapper, autofac

Autofac 3 i Automapper - automapper, autofac

Czy ktoś wie o kompleksowym przewodniku dokonfiguracja Automappera z Autofac. Jestem nowy w obu, ale grałem ze statyczną klasą Mapper, ale chcę być w stanie wyśmiać i wstrzyknąć IMappingEngine i stworzyć konfigurację, która konfiguruje wszystkie moje mapowania. Naprawdę wyjaśnię, co się dzieje i nie jestem w stanie tego dobrze wykonać. Również używam Autofac 3.0, który wydaje się mieć pewne różnice w metodach ContainerBuilder, które nie pomagają (powodem, dla którego go używam jest Autofac.mvc4 zależy od tego).

Aktualizacja:

OK, najprostsze rozwiązanie wydaje się działać dobrzewystarczająco, jednak nie widziałem go nigdzie w Internecie i że może z jakiegoś powodu, którego nie wiem? Najprostszą rzeczą do zrobienia jest zarejestrowanie statycznego narzędzia Mapper.Engine jako IMappingEngine i nadal używać statycznej Mapper.CreateMap skonfigurować w pierwszej kolejności.

var builder = new ContainerBuilder();
builder.Register<IMappingEngine>(c => Mapper.Engine);

Teraz Autofac może wstrzyknąć przyrząd IMappingEnginetwoi konstruktorzy. Oznacza to, że Mapper będzie obsługiwał singleton IMappingEngine, a nie Autofac, a Autofac działa tylko jako opakowanie. Chciałbym, aby Autofac obsługiwał instancję IMappingEngine, ale nie jestem pewien jak?

Odpowiedzi:

10 dla odpowiedzi № 1

Twoje proste rozwiązanie jest OK pod warunkiem, że tynie chcesz kpić z programu odwzorowującego w testach jednostkowych ani tworzyć maperów ze zmodyfikowanymi konfiguracjami dla zagnieżdżonych zasięgów życia (ten ostatni wygląda nieco dziwnie, ale kto wie).

Jeśli tego potrzebujesz, możesz pobrać kilka kawałków kodu temu Mapper klasa i zarejestrować składniki takie jak to:

builder.Register(ctx => new ConfigurationStore(new TypeMapFactory(), MapperRegistry.AllMappers()))
.AsImplementedInterfaces()
.SingleInstance();

builder.RegisterType<MappingEngine>()
.As<IMappingEngine>();

Nie jestem pewien czy naprawdę trzeba zrobić IMappingEngine pojedyncza. Powinno być dość lekki, aby utworzyć na zależność.

Teraz możesz używać go jak to:

// in a bootstrapper:
var mapperConfig = ctx.Resolve<IConfiguration>();
mapperConfig.CreateMap<A, B>();

// later on:
public class X{
IMappingEngine _mapper;

public X(IMappingEngine mapper){
_mapper = mapper;
}

public B DoSmth(){
return _mapper.Map<B>(new A());
}
}

Można również skonfigurować automatyczne profile rejestracji to tak:

builder.Register(ctx => new ConfigurationStore(new TypeMapFactory(), MapperRegistry.AllMappers()))
.AsImplementedInterfaces()
.SingleInstance()
.OnActivating(x => {
foreach (var profile in x.Context.Resolve<IEnumerable<Profile>>()){
x.Instance.AddProfile(profile);
}
});

Następnie wystarczy się zarejestrować Profile Implementacja nigdzie w Autofac konfiguracji lub moduł, aby dostać ono podłączone do konfiguracji.