Я создаю новый сервис WCF на основе некоторого старого кода. Я думаю, что я сделал все то же самое, но во время создания класса с использованием DI я получаю ошибку:
Для этого объекта не определен конструктор без параметров.
Ниже приведен мой новый код, основанный на основахрабочий один:
public SChangeClaimHandlerStatusDTO ChangeClaimHandler(SChangeClaimHandlerMessageDTO message)
{
(...)
var status =
ServiceProvider<VIG.ZEVIG.BusinessLayer.BusinessLogic.Order.S.SIntegrationService>
.Service.ChangeClaimHandler(message);
//line above is causing error
(...)
return status;
}
и ниже называется класс:
public class SIntegrationService : ServiceBase
{
private const int SImageExpirationTimeInMinutes = 60;
public SIntegrationService(
IDocumentService documentService,
IAttachmentService attachmentService,
IUserService userService,
ITextEncryptor textEncryptor, (...) )
{
RegisterService<IDocumentService>(documentService);
RegisterService<IAttachmentService>(attachmentService);
RegisterService<IUserService>(userService);
RegisterService<ITextEncryptor>(textEncryptor);
(...)
}
}
public class ServiceBase : IBusinessService
{
public ServiceBase();
public ServiceBase(Dictionary<Type, object> dependencies);
protected IAppContext ApplicationContext { get; }
protected void RegisterService<T>(T dependency) where T : class;
}
И класс ServiceProvider выглядит следующим образом:
public class ServiceProvider<T> where T : class
{
public ServiceProvider();
public static T Service { get; }
}
класс SIntegrationService имеет толькоодин конструктор (без конструктора без параметров). Обе программы имеют ссылки SimpleInjector.
Я довольно новичок в DI, поэтому, может быть, я упускаю что-то очевидное, может быть, я должен положить что-то в файл конфигурации, чтобы сообщить, что будет включен DI? Я знаю, что это должно работать таким образом, потому что я смотрю на код в другом проекте, который работает нормально.
В других конфигурациях проекта у меня также есть эта строка:
<Services
AutoWire="false"
IocContainer="V.Common.Ioc.SimpleInjector.SimpleInjectorContainerAdapter, V.Common.Ioc.SimpleInjector"/>
Может быть, это решение?
Ниже приведено подробное описание ошибки:
System.MissingMethodException HResult = 0x80131513
Сообщение = Не определен конструктор без параметров для этого объекта.
Исходная строка "mscorlib"
StackTrace "в System.RuntimeTypeHandle.CreateInstance (тип RuntimeType>, тип Boolele, Boolele Boolele NoNely, BooleancanBeCached,> RuntimeMethodHandleInternal & ctor, Boolean & bNeedSecurityCheck) \ r \ n
в System.RuntimeType.CreateInstanceSlow (логическое значение publicOnly, логическое значение skipCheckThis, логическое значение fillCache, стек BoockEntClayMateCoreCatelMateClayRateClayRateCatel). skipCheckThis, Boolean fillCache, StackCrawlMark & stackMark) \ r \ n в System.Activator.CreateInstance (Тип тип, логический nonPublic) \ r \ n в System.Activator.CreateInstance (Тип тип) \ r \ n
в V.Common.Services.ServiceProvider`1.get_Service () \ r \ n в BusinessServices. SIntegration.SIntegrationService.ChangeClaimHandler (сообщение SChangeClaimHandlerMessageDTO) в D: \ TFS1 \ Branches \ Release 1.2.1 Env01 \ ZV \ BusinessServices.SIntegration \ SOrderService.svc.cs: строка 31 \ r \ n в объекте SyncInvoimChanler (SyncInvokeChange)Object []) \ r \ n в System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke (Экземпляр объекта, входы Object [], Object [] & output) \ r \ n в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin (MessageRpc & rpc) "строка