需要从UnityContainer调用每个方法的依赖项

问题描述

| 因此,在我当前的代码中,我正在开发某种通知管理器。 这个想法是我的主要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