类库中带有Automapper的c#Ninject

类库中带有Automapper的c#Ninject,c#,.net,entity-framework-6,automapper,ninject,C#,.net,Entity Framework 6,Automapper,Ninject,我将我的项目组织成类库和一个主调用者(现在是一个控制台应用程序,然后是API) 达尔图书馆 BL图书馆 模型(实体)库 主(控制台应用程序) 我添加了Automapper,并将其配置为在DAL和BL之间工作(模型将所有暴露BL层的实体表示为与其他项目相同的点)。 这很好,但我决定通过IoC容器注入一个IMapper,以便将接口传递给构造函数。 记住我的体系结构,我如何为此配置Ninject 我将Automapper与“Api实例”一起使用,如下所示: var config = new Map

我将我的项目组织成类库和一个主调用者(现在是一个控制台应用程序,然后是API)

  • 达尔图书馆
  • BL图书馆
  • 模型(实体)库
  • 主(控制台应用程序)
我添加了Automapper,并将其配置为在DAL和BL之间工作(模型将所有暴露BL层的实体表示为与其他项目相同的点)。 这很好,但我决定通过IoC容器注入一个IMapper,以便将接口传递给构造函数。 记住我的体系结构,我如何为此配置Ninject

我将Automapper与“Api实例”一起使用,如下所示:

var config = new MapperConfiguration(cfg => {
    cfg.AddProfile<AppProfile>();
    cfg.CreateMap<Source, Dest>();
});


var mapper = config.CreateMapper();
然后将映射器传递给构造函数


如果您有更好的解决方案,请随时发布。

以最简单的形式发布:

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>();
var-kernel=new-StandardKernel();
var mapperConfiguration=新的mapperConfiguration(cfg=>{cfg.AddProfile();});
Bind().ToConstructor(c=>newmapper(mapperConfiguration)).InSingletonScope();
var mapper=kernel.Get();
使用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)
    {
    }
}
public类AutoMapperModule:ninject模块
{
公共覆盖无效负载()
{
var mapperConfiguration=新的mapperConfiguration(cfg=>{cfg.AddProfile();});
this.Bind().ToConstructor(c=>newmapper(mapperConfiguration)).InSingletonScope();
this.Bind().ToSelf().InSingletonScope();
}
}
公共类根
{
公共根目录(IMapper映射器)
{
}
}

var-kernel=new-StandardKernel(new-AutoMapperModule());
var root=kernel.Get();

@LucianBargaoanu,我见过那个医生,但我不太清楚。例如,AutoMapperModule和Register之间的区别。只是澄清一下,通常您不会在模块内部创建内核。但首先要创建内核,然后用模块配置内核。请参阅我编辑的答案“如何正确使用Ninject模块”。另外,
Get()
仅用于演示目的,您很可能仅将此方法用于解析对象图的根对象,而
IMapper
将由Ninject自动传递给构造函数。所以不需要手动传递一些东西。谢谢Jan,你是说所有的类都应该从根类继承吗?AutoMapperModule是放在客户机中还是放在库中?请您在类库和客户端(webapi、控制台应用程序)中放一个小例子好吗?我不知道映射器是如何自动注入的。非常感谢@MaxBertoli,不,
Root
只是一些依赖于
IMapper
的类的一个例子,如果您使用webapi,它也可以是一个控制器。在web.api的情况下,您将使用Ninject web扩展,并且您的控制器由Ninject及其所有依赖项创建。对于控制台应用程序,它会取消您需要执行的操作,但您可能会解析一些根对象<代码>自动映射模块是合成根目录的一部分。
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>();
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>();