D3v*_*3vy 7 c# dependency-injection inversion-of-control asp.net-core
我有一个Generic存储库,我想注册DI,它实现了一个接口IRepository.
通常我会像这样创建一个实例:
IRepository repo = new Repository<Order>();
Run Code Online (Sandbox Code Playgroud)
不过我想起床的速度在.NET 5提前释放,并希望得到这与DI的工作,我已经使出了以下内容:
services.AddTransient<DAL.IRepository<Models.Order>, DAL.Repository<Models.Order>>();
Run Code Online (Sandbox Code Playgroud)
但这感觉不对,我不希望在我的模型中的每个类中都有50多行...
我在网上找不到任何关于此的信息,我知道它可能与其他ioc容器有关..但由于这是一个学习项目,我不想使用另一个容器,我的目标是用.net5s原生容器来做.
quj*_*jck 11
您应该能够注册开放通用
services.AddTransient(typeof(IRepository<>), typeof(Repository<>));
Run Code Online (Sandbox Code Playgroud)
在对其他答案的评论中来回转发之后,我有了一个可行的解决方案,它可能不是最佳方法,但它可以工作。如果我找到一种更好的方法来实现这一目标,疾病将再次更新。
我遇到的两个问题是:需要注册一个通用接口,这里的问题是我的专心。
services.AddTransient(typeof(IRepository<>), typeof(Repository<>));
Run Code Online (Sandbox Code Playgroud)
第二个问题是我有一个程序集,其中包含要注册的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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后从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<>));
}
Run Code Online (Sandbox Code Playgroud)
可能有更好的方法来执行此操作,肯定使用了不同的DI容器,如果有人可以提供改进,请告诉我。