问题描述
|
因此,在我当前的代码中,我正在开发某种通知管理器。
这个想法是我的主要BL将在每个方法调用中使用此通知管理器。因此,大概将只有一个通知管理器(我想单一的通知管理器)。
使用通知管理器时,可以通过SMS \\ Email \\ Other发送通知。实际发生的情况是,通知管理器解析了一个“ INotificationProvidor”,它也驻留在统一容器中。此解析按名称完成,如\“ SMS \”,\“ Email \”,\“ Other \”。
这是一个小代码段:
var notificationProvidor =
m_Container.Resolve<INotificationProvidor<TResult>>(
typeOfNotification.ToString());
ResultMessage<TResult> notificationResult = notificationProvidor
.SendNotification(source,destination,message,subject);
如您所见,通知管理器拥有一个容器实例来解析每个“ INotificationProvidor”。
我怎样才能消除将容器保存在通知管理器中的这种需要?有以下限制:
并非所有类型的“ INotificationProvidor”(SMS,电子邮件,其他)都可以在容器中注册。
将只有一个通知管理器。 (因为BL会在申请过程中使用它,并且会从DI那里收到它)
简而言之...解决每个方法调用的依赖性。 :)
解决方法
我建议这样做的唯一方法是使用某种工厂来解析
INotificationProvider
而不是Unity容器,在任何情况下,您都必须持有对某些内容的引用,这将在运行时解析依赖项。
这是工厂的界面:
interface IProvidersResolver
{
INotificationProvider<TNotification> Resolve<TNotification>();
}
这就是您在NotificationManager
中使用它的方式:
// here you hold the reference to the resolver
private IProvidersResolver _resolver;
// here you use injected factory to resolve INotificationProvider
void UseResolver()
{
INotificationProvider<SomeNotification> provider = _resolver.Resole<SomeNotification>();
}
因此,您仅持有IProviderResolver
(工厂)的引用。这是惯例。或者,您可以:
每INotificationProvider<TNotification>
实例化NotificationManager
将对容器的引用传递到NotificationManager
, 我会使用Factory模式。可以使用自己的界面和实现来创建自己的界面。或者,我相信许多IoC框架都很聪明,当您尝试解析“ 9”时,它们将自行动态创建工厂方法。
实际上,工厂实现可能需要引用容器本身,但是不需要将此实现作为项目的一部分。它可以是项目的一部分,引用容器是没有问题的。
, 我认为您可以通过依赖工厂来解决此问题,该工厂将把typeOfNotification转换为需要基于字符串的NotificationPrivider
的类中的实际NotificationProvider
。工厂类将由容器创建,并将所有可用的通知提供程序注入其构造函数。
然后,您可以让容器在合成根目录中为您完成所有接线,但是让每种方法根据字符串值typeOfNotification
得到NotificationProvider