c# - Ninject 与 class 库中的 Automapper
c# - Ninject with Automapper in class library
我将我的项目组织成 class 个库和一个主调用程序(现在是一个控制台应用程序,然后是 Apis)。
- DAL 库
- BL图书馆
- 模型(实体)库
- 主要(控制台应用程序)
我添加了 Automapper 并将其配置为在 DAL 和 BL 之间工作(模型将所有暴露 BL 层的实体表示为与其他项目的共同点)。
这很好,但我决定通过 IoC 容器注入一个 IMapper,这样我就可以将接口传递给构造函数。
请记住我的体系结构,我如何为此目的配置 Ninject?
我将 Automapper 与 "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();
然后将映射器传递给构造函数...
如果您有更好的解决方案,请随时 post。
最简单的形式很简单:
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>();
我将我的项目组织成 class 个库和一个主调用程序(现在是一个控制台应用程序,然后是 Apis)。
- DAL 库
- BL图书馆
- 模型(实体)库
- 主要(控制台应用程序)
我添加了 Automapper 并将其配置为在 DAL 和 BL 之间工作(模型将所有暴露 BL 层的实体表示为与其他项目的共同点)。 这很好,但我决定通过 IoC 容器注入一个 IMapper,这样我就可以将接口传递给构造函数。 请记住我的体系结构,我如何为此目的配置 Ninject?
我将 Automapper 与 "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();
然后将映射器传递给构造函数...
如果您有更好的解决方案,请随时 post。
最简单的形式很简单:
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>();