【发布时间】: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