【发布时间】:2021-12-05 10:30:09
【问题描述】:
我有如下通用服务:
public interface ISyncedDataService<T> where T : BaseDBModel
{
Task<int> SaveItem(T item);
Task<int> InsertAllItems(List<T> items);
Task<List<T>> GetItems();
Task<T> GetItem(long primaryKey);
Task<int> DeleteItem(T item);
}
并且有一堆类 T1, T2, T3, T4.. T20 继承自 BaseDBModel。
我正在使用 Autofac 来调用如下服务:
using var scope = App.Container.BeginLifetimeScope(); //Container is Autofac.IContainer
var items = await scope.Resolve<ISyncedDataService<T1>>().GetItems(); //T1 inherits BaseDBModel
如果类型 T1...T20 仅在运行时已知,我如何调用 GetItems()?目前我正在使用 if-else 链来使其简单快速。但是我很好奇我如何动态地做到这一点(反思?)
编辑: 使用反射时,挑战在于尝试动态获取扩展方法的 MethodInfo,该扩展方法也是通用方法。
【问题讨论】:
-
不重要,但最好知道这些类型是如何注册的。是否需要您在这里需要一个嵌套范围? (并不是说它对你的问题有影响,只是知道)。
-
builder.RegisterInstance(GetService(DependencyService.Get
>())).AsImplementedInterfaces().SingleInstance(); //对所有 T1 .. T20 执行此操作。并且服务注册为 [assembly: Xamarin.Forms.Dependency(typeof(Project.Droid.Services.SyncedDataService ))] [assembly: Xamarin.Forms.Dependency(typeof(Project.Droid.Services.SyncedDataService ))] namespace Project.Droid.Services { public class SyncedDataService : Services.SyncedDataService where T : Models.BaseDBModel, new() { } } //Android 也一样,iOS 也一样 -
注册实例重要吗?如果是这样,
DependencyService.Get<ISyncedDataService<T1>>如何为您解决实例?这是外部 DI 服务吗?