按类型处理对象列表

时间:2015-04-27 13:35:31

标签: c# ninject asp.net-web-api nancy onion-architecture

我需要创建一个Sync方法。 1)在输入时它需要SyncRequest对象。

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

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

即。如果我得到的用户,用户,任务类型的3个对象。我将按类型对它们进行分组,然后继续使用UserService和TaskService。
我正在尝试使用洋葱架构来构建我的web.api。 DataAccess,Core,Services彼此分开的地方。我希望在我的代码中避免使用swich或if。,

我提出的所有想法都很难看。例如Dicitionary<Type, Service>和手动投射。

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

任何人都可以描述这种模式应该如何运作。或者这个模式如何调用,在哪里阅读。

1 个答案:

答案 0 :(得分:1)

由于你所拥有的只是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。 要坚持洋葱分层,你必须将使用内核的代码移动到组合根并给它一个接口...... 由于您似乎了解洋葱分层,因此我不会详细介绍:)