所以在我目前的代码中,我正在研究某种通知管理器。
这个想法是我的主BL将在每次方法调用时使用此通知管理器。因此,可能只有一个通知管理器(我认为这是统一的单身)。
使用通知管理器时,您可以通过SMS \ Email \ Other发送通知。实际发生的是通知管理器解析了一个“INotificationProvidor”,它也位于统一容器中。此解析通过名称完成,如“SMS”,“电子邮件”,“其他”。
这是一个小代码片段:
var notificationProvidor =
m_Container.Resolve<INotificationProvidor<TResult>>(
typeOfNotification.ToString());
ResultMessage<TResult> notificationResult = notificationProvidor
.SendNotification(source, destination, message, subject);
正如您所见,通知管理器持有容器的实例来解析每个“INotificationProvidor”。
如何才能删除在通知管理器中保存容器的需要?有以下限制:
简而言之......解决每个方法调用的依赖性。 :)
答案 0 :(得分:2)
我会使用Factory pattern。使用您自己的界面和实现创建自己的。或者我相信很多IoC框架都很聪明,当你尝试解决Func<string, INotificationProvidor<TResult>>
时,他们会自己动态地创建工厂方法。
实际工厂实现可能需要引用容器本身,但不需要将此实现作为项目的一部分。它可以是项目的一部分,对容器的引用没有问题。
答案 1 :(得分:1)
我建议唯一的方法是使用某种工厂来解析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
(工厂)。这是常见的做法。或者你也可以:
NotificationManager
INotificationProvider<TNotification>
NotificationManager
答案 2 :(得分:0)
我认为您可以通过依赖工厂来解决这个问题,这会将typeOfNotification转换为需要能够根据sting获得NotificationProvider
的类中的实际NotificationPrivider
。工厂类将由容器创建,并将所有可用的通知提供程序注入其构造函数中。
然后,您可以让容器在合成根中为您完成所有连接,但是根据字符串值NotificationProvider
typeOfNotification