我正在尝试在我的软件上实现Core的依赖注入,以取代Ninject并将所有内容更新为我们的新技术。
顺便说一句,我在某些通用接口上遇到问题。对于这种情况,我直接得到一个异常,即注入器无法创建我的类的实例。
我在一个样本盒的小片段上方插入,让我着火。
services.AddTransient(typeof(IRepository), typeof(MyRepository<,>))
这样正确吗?我怎么能这样做?
班级实施:
public class MyRepository<TEntity, TContext> : IRepositoryBase
where TEntity : class
where TContext : IDbContext, new()
{
...
}
接口:
public interface IRepository : IDisposable
{
...
}
谢谢!
答案 0 :(得分:5)
这没有多大意义。您将询问容器IRepository
,那么它如何知道泛型类型参数应该是什么,以便它可以为您提供MyRepository<,>
?
所以当被要求返回这样的对象时:
public class MyService
{
private IRepository<Something, SomethingElse> _repo;
public MyService(IRepository<Something, SomethingElse> repo)
{
// Container will actually give us MyRepository<Something, SomethingElse>
_repo = repo;
}
}
我希望:
services.AddTransient(typeof(IRepository<,>), typeof(MyRepository<,>));
或者,如果您的存储库不需要是通用的(我不明白为什么它需要两个泛型参数),那么我希望这样:
services.AddTransient(typeof(IRepository), typeof(MyRepository));
但是,由于此处不涉及泛型,您可以使用替代形式以更少的输入实现相同的功能:
services.AddTransient<IRepository, MyRepository>();
所以答案是解决你的界面/类设计。显示更多的实现将有所帮助。
<强>更新强>
您的实施需要:
班级实施:
public class MyRepository<TEntity, TContext> : IRepository<TEntity, TContext>
where TEntity : class
where TContext : IDbContext, new()
{
...
}
接口:
public interface IRepository<TEntity, TContext> : IDisposable
where TEntity : class
where TContext : IDbContext, new()
{
...
}
答案 1 :(得分:0)
我最终使用了Autofac,并且在我的结构上没有任何变化,一切都重新开始了。
将等待更多文档和更多人使用,因此我可以更改我的实现以使用MS DI。
答案 2 :(得分:0)
要注册所有存储库,请使用以下命令:
var allRepositories = GetType().GetTypeInfo()
.Assembly.GetTypes().Where(p =>
p.GetTypeInfo().IsClass &&
!p.GetTypeInfo().IsAbstract &&
typeof(IRepository).IsAssignableFrom(p));
foreach (var repo in allRepositories)
{
var allInterfaces = repo .GetInterfaces();
var mainInterfaces = allInterfaces.Except
(allInterfaces.SelectMany(t => t.GetInterfaces()));
foreach (var itype in mainInterfaces)
{
services.AddScoped(itype, repo);
}
}
然后解决它:
public YourClass(IRepository<T> repo)
{
//...
}