我是依赖注入和统一框架的新学习者。我的问题场景是 - 我有界面
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。?
答案 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);
无论如何,我不建议使用这种方法。它最终与循环完全相同,但它使代码更复杂,因此没有真正的好处。