Тип Регистратора Единства Образца Декоратора Проблема - PullRequest
0 голосов
/ 27 февраля 2020

Мне нужно реализовать шаблон декоратора для расширения поведения класса. У меня есть интерфейс:

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")));

У вас есть какие-либо предложения, как правильно зарегистрировать этот декоратор?

1 Ответ

0 голосов
/ 03 марта 2020

это будет делать:

container
    .RegisterType<IExternalVerifierCaller, FormatCheck4PxVerifierCaller>(
        "FormatCheck4PxVerifierDisablePfrCheckXml",
        new ContainerControlledLifetimeManager(), new InjectionConstructor(true, false))
    .RegisterType<IExternalVerifierCaller, FormatCheck4PxVerifierCaller>(
        "FormatCheck4PxVerifierDisablePfrUfa",
        new ContainerControlledLifetimeManager(),
        new InjectionConstructor(false, true))
    .RegisterType<IExternalVerifierCaller, ExternalModuleControlVerifierCallerDecorator>(
        "ExternalModuleControlVerifierCallerDecorator", new ContainerControlledLifetimeManager(),
        new InjectionConstructor(
            new ResolvedParameter<IExternalVerifierCaller>("FormatCheck4PxVerifierDisablePfrUfa"),
        new ResolvedParameter<IAbonentContextProvider>(),
        new ResolvedParameter<ILogger>()))
    .RegisterType<IAbonentContextProvider, ThreadDependentAbonentContextProvider>(new PerThreadLifetimeManager())
    .RegisterType<ILogger, DefaultLoggerBridge>(new ContainerControlledLifetimeManager());
...