我需要创建一个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可能对我的问题有很好的答案,有一些工厂功能,但我无法想出来。
任何人都可以描述这种模式应该如何运作。或者这个模式如何调用,在哪里阅读。
答案 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
。
要坚持洋葱分层,你必须将使用内核的代码移动到组合根并给它一个接口......
由于您似乎了解洋葱分层,因此我不会详细介绍:)