c# - 在类库

时间:2018-02-16 17:14:19

标签: c# .net entity-framework-6 automapper ninject

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

  • DAL图书馆
  • BL library
  • 模型(实体)库
  • 主要(控制台应用程序)

我添加了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传递给构造函数......

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

1 个答案:

答案 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>();