如何将AutoMapper 5.2与SimpleInjector结合用于IIS

时间:2017-02-27 14:53:50

标签: c# wcf automapper simple-injector

到目前为止,我们已将SimpleInjector.Integration.Wcf中的SimpleInjectorServiceHostFactory用于我们的WCF服务。 当我们将接口作为SimpleInjector应该解析的参数时,这允许我们避免使用典型的" No无参数构造函数#34;

在global.asax中:

var container = new Container();
container.Options.DefaultScopedLifestyle = new WcfOperationLifestyle();
container.Register<IOurBusinessService, OurBusinessService>();
container.Verify();
SimpleInjectorServiceHostFactory.SetContainer(container);

要配置/注册AutoMapper,我们会调用一些代码在Global.asax中注册它,如下所示:

var cfg = new MapperConfigurationExpression();
cfg.CreateMap<SomeObject, SomeObjectDTO>();
Mapper.Initialize(cfg);
Mapper.Configuration.AssertConfigurationIsValid();

然而,当使用net.tcp端点直接调用我们的Web服务时,似乎没有更多的AutoMapper注册。这似乎就是这种情况,因为当直接请求WCF服务时,Application_Start中的Global.asax中的代码永远不会被执行。

我们目前尝试从ServiceHostFactory派生并在我们重写的CreateServiceHost方法中注册AutoMapper和SimpleInjector。 然而,这确实再次给了我们&#34;没有定义无参数构造函数&#34;错误。

您有任何解决方案或最佳做法吗?

2 个答案:

答案 0 :(得分:1)

您的配置是否正确?

您可以在启动时创建Mapper,然后将其作为单例依赖项注入:

创建Mappercode found here):

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

var mapper = config.CreateMapper();
// or
IMapper mapper = new Mapper(config);

注册为单身:

var container = new Container();

// Registrations
container.RegisterSingleton(typeof(IMapper), mapper);

注入:

public class MyClass 
{
    private readonly IMapper mapper;
    public MyClass(IMapper mapper)
    {
        this.mapper = mapper;
    }
}

我不确定这是否会解决您“无参数构造函数”问题,但这是处理AutoMapper注入的好方法。如果它没有解决问题,请告诉我。

如果您有疑问,请告诉我。

答案 1 :(得分:0)

使上述场景工作的一种方法是从SimpleInjectorServiceHostFactory派生并在那里进行覆盖。

public class OurServiceHostFactory : SimpleInjectorServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        // ConfigInit is a static class with a simple check, to see if the configuration was already initialized
        // the same method ConfigInig.Configure() is also called in the Global.asax in Application_Start
        ConfigInit.Configure();
        return base.CreateServiceHost(serviceType, baseAddresses);
    }
}