c# - 装饰器模式 Unity 寄存器类型问题
问题描述
我需要实现装饰器模式来扩展类行为。我有一个界面:
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")));
你对如何正确注册这个装饰器有什么建议吗?
解决方案
这会做:
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());
推荐阅读
- swiftui - 重命名模式表上的取消按钮
- r - 将每一行除以R中的前一行
- active-directory - 我希望迁移 adb2c,但旧广告使用由 userflow 实现的 mfa。如何获得strongAuthenticationPhoneNumber?
- c# - 为什么在使用数据模板时视图的数据上下文是视图模型?
- kubernetes - 在 Ingress-Nginx 上接收请求后,如何使用 Keycloak(用于身份验证/授权)作为中间件?
- javascript - 使用动态 html 表格的内容
- r - 如何根据向量元素在列表中的位置替换它们?
- psycopg2 - 我正在尝试在我的 Mac 上安装 django-heroku,但出现以下错误
- swift - LPMetadataProvider/LinkPresentation:如何在 Slack/WhatsApp 上使用自定义图像/图标,...?
- swiftui - SwiftUI iOS14 GeometryReader 框架尺寸无效