【问题标题】:How to combine AutoMapper 5.2 with SimpleInjector for WCF service hosted in IIS如何将 AutoMapper 5.2 与 SimpleInjector 结合起来用于 IIS 中托管的 WCF 服务
【发布时间】:2017-02-27 14:53:49
【问题描述】:

到目前为止,我们已将 SimpleInjector.Integration.Wcf 中的 SimpleInjectorServiceHostFactory 用于我们的 WCF 服务。 当我们将接口作为 SimpleInjector 应该解析的参数时,这使我们能够避免典型的“未定义无参数构造函数”。

在 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();

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

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

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

【问题讨论】:

    标签: c# wcf automapper simple-injector


    【解决方案1】:

    你的配置正确吗?

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

    创建Mapper (code 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 注入的好方法。如果它不能解决问题,请告诉我。

    如果您有任何问题,请告诉我。

    【讨论】:

    • 感谢您的回答,我认为将 IMapper 传递给所有需要的构造函数是有意义的。目前我们直接使用 Mapper.Map<...>(...) 。也许这是一种反模式?
    • 我认为按照您的指定在 SimpleInjector 中初始化 AutoMapper 是有意义的,但要使其在上述场景中工作,似乎需要从 SimpleInjectorServiceHostFactory 继承。我想我会把我自己的标记为答案。
    • 是的,似乎还有更多问题。我确实认为直接调用有点反模式,但老实说,这并不重要。除非您遇到一些集成问题,否则我不会担心重构。
    【解决方案2】:

    使上述方案发挥作用的一种方法是从 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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-08
      • 2021-09-16
      • 2022-12-13
      • 2012-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多