使用统一依赖框架

时间:2015-08-08 00:14:25

标签: c# dependency-injection unity-container

我是依赖注入和统一框架的新学习者。我的问题场景是 - 我有界面

public interface INofifyEventDataService
{
    void StatusUpdate (object objectType, JobStatus status = JobStatus.None,string messageTitle=null ,string MessageDetails=null);
}

和类

Public class A :  INofifyEventDataService
{ 
 void StatusUpdate (object objectType, JobStatus status = JobStatus.None,string messageTitle=null ,string MessageDetails=null)
{ //implementation form A}}

和B组

Public class B:  INofifyEventDataService
{ 
 void StatusUpdate (object objectType, JobStatus status = JobStatus.None,string messageTitle=null ,string MessageDetails=null)
{ //implementation form B}}

和DBLogger(假设为c类)

Public class DBLogger :  INofifyEventDataService
{ 
 void StatusUpdate (object objectType, JobStatus status = JobStatus.None,string messageTitle=null ,string MessageDetails=null)
{ //implementation form DBLogger }

据我所知,团结解决它就像

IUnityContainer myContainer = new UnityContainer();
myContainer.RegisterType<INofifyEventDataService, DBLogger >();
myContainer.RegisterType<INofifyEventDataService, classA>("A");
myContainer.RegisterType<INofifyEventDataService, classB>("B");

它将逐个或全部解决

IEnumerable<INofifyEventDataService> serviceList = myContainer.ResolveAll<INofifyEventDataService>();

我需要枚举所有对象,然后像每个对象一样调用

servicelistObjectA.statusupdate(obj,status,message,title)

我的要求是从单个解析对象调用每个类StatusUpdate。?

1 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,您希望在StatusUpdate的所有实例上调用INotifyEventDataService,但只需一次调用,而无需循环遍历ResolveAll返回的列表。这在C#中实际上是不可能的;你可以使用一个方法,但在内部这个方法仍然使用循环。

例如,您可以使用List<T>.ForEach

List<INofifyEventDataService> serviceList = myContainer.ResolveAll<INofifyEventDataService>().ToList();
serviceList.ForEach(service => service.StatusUpdate(obj,status,message,title));

(请记住,它与foreach循环相同,您可以在每个项目上调用方法。)

另一种看起来好像是一次调用所有方法的方法是将所有实例的StatusUpdate方法组合到一个多播委托中。首先,声明一个这样的委托(你可以使用Action<....>,但是一个命名的委托使代码更具可读性):

delegate void StatusUpdateDelegate(object objectType, JobStatus status = JobStatus.None, string messageTitle = null, string MessageDetails = null);

然后创建一个这样的委托实例:

var statusUpdate =
    container.ResolveAll<INotifyEventDataService>()
        .Aggregate(default(StatusUpdateDelegate), (d, x) => d + x.StatusUpdate);

然后,您可以调用委托,该委托将调用所有方法:

statusUpdate(obj,status,message,title);

无论如何,我不建议使用这种方法。它最终与循环完全相同,但它使代码更复杂,因此没有真正的好处。