MVC依赖注入问题

时间:2016-08-02 14:50:12

标签: c# asp.net-mvc dependency-injection asp.net-core

我正在尝试在我的软件上实现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
{
...
}

谢谢!

3 个答案:

答案 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)
{
    //...
}