到目前为止,我们已将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;错误。
您有任何解决方案或最佳做法吗?
答案 0 :(得分: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注入的好方法。如果它没有解决问题,请告诉我。
如果您有疑问,请告诉我。
答案 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);
}
}