按类型处理对象列表

Process list of object by type

我需要创建同步方法。 1) 在输入时它需要 SyncRequest 对象。

class SyncRequest{
    public List<SyncObj> Objects{get;set;}
}
class SyncObj{
    public Type Type{get;set;}
    public object Object{get;set;}
}

2) 根据每个对象的类型,我需要使用不同的服务来继续并使用不同的存储库来保存数据。

即如果我得到 3 个类型为 User、User、Task 的对象。我将它们按类型分组,然后继续 UserService 和 TaskService。
我正在尝试使用 Onion Architecture 构建我的 web.api。 DataAccess、Core、Services 彼此分离。我想在我的代码中避免 swich 或 if's。

我想出的所有想法都很丑陋。例如Dicitionary<Type, Service>,手动投射。

我觉得 Ninject 可能对我的问题有非常好的答案,有一些工厂功能,但我想不出来。

谁能描述一下这个模式应该如何工作。或者这个模式怎么调用,在哪里看。

由于您所拥有的只是Type 一种方式或另一种方式,您将不得不使用反射。另一个问题是您如何访问 DI 容器(ninject 内核)。

你可以这样做:

public interface IHandler<T>
{
    void Handle(T obj);
}

public void UserService : IHandler<User> {...}

Bind<IHandler<User>>().To<UserService>();

然后你会像这样使用它:

foreach(var syncObj in syncRequest.Objects) 
{
    Type handlerType = typeof(IHandler<>).MakeGeneric(syncObj.Type);
    MethodInfo handleMethod = handlerType.GetMethod("Handle");

    object handler = kernel.Get(handlerType);

    handleMethod.Invoke(handler, new object[] { syncObj.Object });
}

如您所见,您需要以某种方式访问容器以创建特定类型。您可以将其注入为 IResolutionRoot。 要坚持洋葱分层,您必须将使用内核的代码移动到组合根并为其提供接口...... 既然你似乎知道洋葱分层,我就不多说了:)