在 cmets 中对其他答案进行了一些来回后,我有了一个可行的解决方案,这可能不是最好的方法,但它确实有效。如果我找到更好的方法来实现它,我会再次更新。
我遇到的两个问题是:需要注册一个泛型接口,这里的问题是我的注意力不集中。我注册泛型类型的语法错误,当然是:
services.AddTransient(typeof(IRepository<>), typeof(Repository<>));
第二个问题是我有一个程序集,其中包含我想要注册的 50 多个不同模型,我解决这个问题的方法是编写一个方法,我可以将程序集列表与我想要的命名空间一起传递给进行注册,它会遍历任何符合条件的类型并将它们注册到 DI 容器中。
public void RegisterModels(IServiceCollection services, string[] Assemblies, string @NameSpace)
{
foreach (var a in Assemblies)
{
Assembly loadedAss = Assembly.Load(a);
var q = from t in loadedAss.GetTypes()
where t.IsClass && !t.Name.Contains("<") && t.Namespace.EndsWith(@NameSpace)
select t;
foreach (var t in q.ToList())
{
Type.GetType(t.Name);
services.AddTransient(Type.GetType(t.FullName), Type.GetType(t.FullName));
}
}
}
然后从 startup.cs 方法 ConfigureServices 调用它:
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<TestContext>(options =>
options.UseSqlServer(@"Server=LOCALHOST\SQLEXPRESS;Database=Test;Trusted_Connection=True;"));
services.AddMvc();
RegisterModels(services, new string[] { "UI" }, "UI.Models");
services.AddTransient(typeof(IRepository<>), typeof(Repository<>));
}
可能有更好的方法来做到这一点,肯定是使用不同的 DI 容器,如果有人有改进,请告诉我。