【问题标题】:Decorator Pattern Unity Register Type Issue装饰器模式 Unity 寄存器类型问题
【发布时间】:2020-06-11 18:06:14
【问题描述】:

我需要实现装饰器模式来扩展类行为。我有一个界面:

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

你对如何正确注册这个装饰器有什么建议吗?

【问题讨论】:

    标签: c# dependency-injection decorator


    【解决方案1】:

    这样就可以了:

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

    【讨论】:

      猜你喜欢
      • 2016-10-05
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      相关资源
      最近更新 更多