0

如何告诉 AutoMapper 5 使用 StructureMap 构建服务而不产生引导问题,即new MapperConfiguration(cfg => cfg.ConstructServicesUsing(some_IContainer))当通过 StructureMap 进行配置时?

自定义解析器需要 AutoMapper 使用的服务定位器,但IContainer在 AutoMapper 在 StructureMap 注册表中初始化时还不存在。静态ObjectFactory.Container在 StructureMap 中已被弃用,所以我有一个惰性 ObjectFactory:

public static class ObjectFactory
{
    private static readonly Lazy<Container> _containerBuilder =
            new Lazy<Container>(defaultContainer, LazyThreadSafetyMode.ExecutionAndPublication);

    public static IContainer Container
    {
        get { return _containerBuilder.Value; }
    }

    private static Container defaultContainer()
    {
        return new Container(x =>
        {
            x.AddRegistry<MyRegistry>(); // AutoMapper is configured here
        });
    }
}

我无法ObjectFactory.Container从 AutoMapper 配置文件中引用,因为我得到堆栈溢出或“在惰性工厂中引用的值”。

.ConstructUsing(some_IContainer)配置 AutoMapper 后有什么办法吗?

4

1 回答 1

0

您可以通过使用基于 lamdba 的注册来利用容器 - 即使它尚未构建。

您的注册MapperConfiguration可能类似于:

class MyRegistry : Registry
{
    public MyRegistry()
    {
        For<MapperConfiguration>()
            .Use("Use StructureMap context to resolve AutoMapper services", ctx =>
            {
                return new MapperConfiguration(config =>
                {
                    config.ConstructServicesUsing(type => ctx.GetInstance(type));
                });
            });
    }
}

这样就避免了先有鸡还是先有蛋的问题。

警告

这段代码我没有测试过,对StructureMap也不熟悉。

于 2017-02-20T00:49:50.920 回答