gpt4 book ai didi

c# - 使用统一依赖框架解决所有方法

转载 作者:太空宇宙 更新时间:2023-11-03 13:02:40 25 4
gpt4 key购买 nike

我是依赖注入(inject)和统一框架的新手。我的问题场景是——我有界面

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 }

据我所知,unity 是这样解决的

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。?

最佳答案

如果我理解正确的话,你想调用StatusUpdateINotifyEventDataService 的所有实例上, 但只需一次调用,就不会遍历 ResolveAll 返回的列表.这在 C# 中是不可能的;您可以使用执行此操作的方法,但该方法在内部仍然使用循环。

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

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

(请记住,它与在每个项目上调用方法的 foreach 循环执行相同的操作)。

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

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

然后像这样创建一个委托(delegate)实例:

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

然后您可以调用委托(delegate),它将调用所有方法:

statusUpdate(obj,status,message,title);

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

关于c# - 使用统一依赖框架解决所有方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31888309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com