C# 从UnityContainer进行的每个方法调用都需要依赖项

C# 从UnityContainer进行的每个方法调用都需要依赖项,c#,dependencies,unity-container,ioc-container,C#,Dependencies,Unity Container,Ioc Container,因此,在我当前的代码中,我正在开发某种通知管理器 我的想法是,我的主BL将在每次方法调用时使用此通知管理器。因此,可能只有一个通知管理器(我想是unity中的singleton) 使用通知管理器时,您可以通过SMS\Email\Other发送通知。实际上,通知管理器解析了一个“INotificationProvidor”,它也驻留在unity容器中。此解析按“SMS”、“电子邮件”、“其他”中的名称完成 下面是一个小代码片段: var notificationProvidor = m_C

因此,在我当前的代码中,我正在开发某种通知管理器

我的想法是,我的主BL将在每次方法调用时使用此通知管理器。因此,可能只有一个通知管理器(我想是unity中的singleton)

使用通知管理器时,您可以通过SMS\Email\Other发送通知。实际上,通知管理器解析了一个“INotificationProvidor”,它也驻留在unity容器中。此解析按“SMS”、“电子邮件”、“其他”中的名称完成

下面是一个小代码片段:

var notificationProvidor =
    m_Container.Resolve<INotificationProvidor<TResult>>(
        typeOfNotification.ToString());

ResultMessage<TResult> notificationResult = notificationProvidor
    .SendNotification(source, destination, message, subject);
var通知提供程序=
m_容器解析(
通知的类型。ToString());
结果消息notificationResult=NotificationProvider
.发送通知(来源、目的地、消息、主题);
如您所见,通知管理器持有容器的一个实例,以解析每个“INotificationProvidor”

如何才能消除在notification manager中保存容器的这种需要?有以下限制:

  • 并非所有类型的“iNotificationProvider”(短信、电子邮件、其他)都可以在容器中注册
  • 只有一个通知管理器。(因为使用它的BL将在申请过程中处于活动状态,并将从DI接收)

简言之…解决每个方法调用的依赖关系。:)

我认为您可以通过依赖工厂来解决这个问题,工厂将通知类型转换为类中实际的
通知提供者
,这些类需要能够基于sting获得
通知私有化者
。工厂类将由容器创建,并将所有可用的通知提供程序注入到其构造函数中

然后,您可以让容器在composition根目录中为您完成所有连接,但是让每个方法根据我将使用的
通知类型的字符串值获取一个
通知提供程序
。或者使用自己的接口和实现创建自己的接口和实现。或者我相信很多IoC框架都很聪明,当你试图解析
Func
时,它们会自己创建工厂方法dynamicali


实际的工厂实现可能需要引用容器本身,但不需要将此实现作为项目的一部分。它可以是项目的一部分,在项目中引用容器是没有问题的。

我建议唯一的方法是使用某种工厂来解析
INotificationProvider
,而不是Unity容器,在任何情况下,您都必须持有对某个东西的引用,该引用将在运行时解析依赖关系

这是工厂的界面:

interface IProvidersResolver 
{
    INotificationProvider<TNotification> Resolve<TNotification>();
}
因此,您仅持有对
IProviderResolver
(工厂)的引用。这是惯例。或者,您可以:

  • 为每个
    INotificationProvider
  • 将对容器的引用传递到
    NotificationManager

  • 再次请注意,我需要解析每个方法调用的依赖项。@阿米尔:是的,在方法中,您会要求工厂为您拥有的
    通知类型
    字符串提供
    通知提供程序。工厂将通过使用已知提供程序的固定列表并返回其中一个提供程序的实例,或在应用程序启动时将NotificationProvider的所有实现注入其中,或通过动态执行解析(可能扫描程序集…)将其解析为NotificationProvider工厂模式总是+1,虽然我宁愿定义一个
    INotificationProviderFactory
    接口而不是使用
    Func
    委托,但这是我个人的偏好。@Steven这就是我为什么说“或”。但我也会优先考虑自定义接口和实现。
    // 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>();
    }