我将项目组织成类库和主调用者(现在是控制台应用程序,然后是Apis)。
我添加了Automapper并将其配置为在DAL和BL之间工作(模型表示公开BL层的所有实体与其他项目共同点)。 这很好,但我决定通过IoC容器注入一个IMapper,这样我就可以将接口传递给构造函数了。 请记住我的架构如何为此目的配置Ninject?
我使用Automapper和#34; Api Instance"像这样:
var config = new MapperConfiguration(cfg => {
cfg.AddProfile<AppProfile>();
cfg.CreateMap<Source, Dest>();
});
var mapper = config.CreateMapper();
由于
解决方案:
在业务逻辑层,我添加了一个Ninject模块:
public class AutomapperModule : NinjectModule
{
public StandardKernel Nut { get; set; }
public override void Load()
{
Nut = new StandardKernel();
var mapperConfiguration = new MapperConfiguration(cfg => { CreateConfiguration(); });
Nut.Bind<IMapper>().ToConstructor(c => new AutoMapper.Mapper(mapperConfiguration)).InSingletonScope();
}
public IMapper GetMapper()
{
return Nut.Get<IMapper>();
}
private MapperConfiguration CreateConfiguration()
{
var config = new MapperConfiguration(cfg =>
{
cfg.AddProfiles(Assembly.GetExecutingAssembly());
cfg.AddProfiles(Assembly.Load("DataAccess"));
});
return config;
}
}
AutoMapper网站上的示例和Jan Muncinsky的答案之间的混合。
我还添加了一个Get方法来修复上下文映射器,仅用于帮助器。 客户只需要打这样的话:
var ioc = new AutomapperModule();
ioc.Load();
var mapper = ioc.GetMapper();
然后将mapper传递给构造函数......
如果您有更好的解决方案,请随时发布。
答案 0 :(得分:1)
在最简单的形式中,它很容易:
var kernel = new StandardKernel();
var mapperConfiguration = new MapperConfiguration(cfg => { cfg.AddProfile<AppProfile>(); });
kernel.Bind<IMapper>().ToConstructor(c => new Mapper(mapperConfiguration)).InSingletonScope();
var mapper = kernel.Get<IMapper>();
使用Ninject模块:
public class AutoMapperModule : NinjectModule
{
public override void Load()
{
var mapperConfiguration = new MapperConfiguration(cfg => { cfg.AddProfile<AppProfile>(); });
this.Bind<IMapper>().ToConstructor(c => new Mapper(mapperConfiguration)).InSingletonScope();
this.Bind<Root>().ToSelf().InSingletonScope();
}
}
public class Root
{
public Root(IMapper mapper)
{
}
}
...
var kernel = new StandardKernel(new AutoMapperModule());
var root = kernel.Get<Root>();