Мне нужно реализовать шаблон декоратора для расширения поведения класса. У меня есть интерфейс:
public interface IExternalVerifierCaller
{
VerificationProtocol Verify(VerificationItem verificationItem);
VerificationProtocolBase Verify(VerificationItems verificationItems);
}
и его реализация с конструктором:
public class FormatCheck4PxVerifierCaller : IExternalVerifierCaller
{
public FormatCheck4PxVerifierCaller(bool isPfrUfaEnable, bool isCheckXmlPfrEnable)
{
...
}
...
}
, поэтому я создал свой декоратор так:
public class ExternalModuleControlVerifierCaller : IExternalVerifierCaller
{
protected IExternalVerifierCaller ExternalVerifierCaller;
private readonly ILogger _logger;
private readonly IAbonentContextProvider _abonentContextProvider;
public ExternalModuleControlVerifierCaller(IExternalVerifierCaller externalVerifierCaller, IAbonentContextProvider abonentContextProvider, ILogger logger)
{
ExternalVerifierCaller = externalVerifierCaller;
_abonentContextProvider = abonentContextProvider;
_logger = logger;
}
public VerificationProtocol Verify(VerificationItem verificationItem)
{
try
{
SendValidateSmallFileHttp(verificationItem);
_logger.LogInfo(
string.Format("Документ с id {0} отправлен на проверку в Модуль контроль",
verificationItem.DocumentId), LogCategoryRepository.Verification, null);
}
catch (Exception e)
{
_logger.LogError("Ошибка проверки в Модуль Контроле: " + e.Message, LogCategoryRepository.Verification);
}
return ExternalVerifierCaller.Verify(verificationItem);
}
public VerificationProtocolBase Verify(VerificationItems verificationItems)
{
try
{
foreach (var verificationItem in verificationItems)
{
SendValidateSmallFileHttp(verificationItem);
_logger.LogInfo(
string.Format("Документ с id {0} отправлен на проверку в Модуль контроль", verificationItem),
LogCategoryRepository.Verification, null);
}
}
catch (Exception e)
{
_logger.LogError("Ошибка проверки в Модуль Контроле: " + e.Message, LogCategoryRepository.Verification);
}
return ExternalVerifierCaller.Verify(verificationItems);
}
....
}
FormatCheck4PxVerifierCaller зарегистрирован следующим образом:
.RegisterType<IExternalVerifierCaller, FormatCheck4PxVerifierCaller>(
"FormatCheck4PxVerifierDisablePfrUfa",
new ContainerControlledLifetimeManager(), new InjectionConstructor(false, true))
И я попытался зарегистрировать его несколькими способами, проблема в том, что класс FormatCheck4PxVerifierCaller должен получить некоторые параметры в конструкторе, и мои решения, похоже, не удовлетворяют Это. Мои решения пока:
1)
.RegisterType<IAbonentContextProvider, ThreadDependentAbonentContextProvider>()
.RegisterType<ILogger, DefaultLoggerBridge>(new ContainerControlledLifetimeManager())
.RegisterType<IExternalVerifierCaller, ExternalModuleControlVerifierCaller>(
"ExternalModuleControlVerifierCaller",
new ContainerControlledLifetimeManager(),
new InjectionConstructor(
container.Resolve<FormatCheck4PxVerifierCaller>(new ParameterOverride("isPfrUfaEnable", false),
new ParameterOverride("isCheckXmlPfrEnable", true)),
container.Resolve<IAbonentContextProvider>(), container.Resolve<ILogger>()))
2)
.RegisterType<IAbonentContextProvider, ThreadDependentAbonentContextProvider>()
.RegisterType<ILogger, DefaultLoggerBridge>(new ContainerControlledLifetimeManager())
.RegisterType<IExternalVerifierCaller, ExternalModuleControlVerifierCaller>(
new ContainerControlledLifetimeManager(),
new InjectionConstructor(
new ResolvedParameter<IExternalVerifierCaller>("FormatCheck4PxVerifierDisablePfrUfa"),
new ResolvedParameter(typeof(IAbonentContextProvider), "ThreadDependentAbonentContextProvider"),
new ResolvedParameter(typeof(ILogger), "DefaultLoggerBridge")));
У вас есть какие-либо предложения, как правильно зарегистрировать этот декоратор?