使用Ninject解析通用存储库

本文关键字:存储 Ninject 使用 | 更新日期: 2023-09-27 18:22:20

我有我的UnitOfWork和GetRepository<T>,我需要用Ninject解决它。

    public TRepository GetRepository<TRepository>() where TRepository : class, IRepository
    {
        throw new NotImplementedException();
    }

我使用MVC,并在NinjectWebCommon.cs中加载模块,如下所示:

    /// <summary>
    /// Creates the kernel that will manage your application.
    /// </summary>
    /// <returns>The created kernel.</returns>
    private static IKernel CreateKernel()
    {
        INinjectModule[] modules = { new CommonModule(), new ServicesModule(), new BusinessModule(), new DataModule() };
        var kernel = new StandardKernel(modules);
        try
        {
            kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
            kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
            RegisterServices(kernel);
            return kernel;
        }
        catch
        {
            kernel.Dispose();
            throw;
        }
    }

知道如何获得GetRepository的实例吗?我尝试创建一个IResolver,并将其注入到我的UnitOfWork中,然后解析该泛型,但我得到了null。

编辑:

我想更新解决方案:

    public UnitOfWork(IDbContext context, IKernel resolver)
    {
        _context = context;
        _resolver = resolver;
    }
    public TRepository GetRepository<TRepository>() where TRepository : class, IRepository
    {
        return (TRepository)_resolver.GetService(typeof(TRepository));
    }

请注意,我使用的是抽象,而不是IResolver的具体实现,所以我不认为这是一种反模式(不过我可能错了)。我正试图弄清楚如何使用IResolutionRoot来解决这个问题,如下所示。

编辑:

在阅读了越来越多的文章后,我认为在使用泛型时,这不是一种反模式。避免泛型的服务定位器的唯一合适的解决方案是反射。所以我特别喜欢使用服务定位器而不是反射。

使用Ninject解析通用存储库

问题的直接答案是在构造函数中声明IKernel(或更好的IResolutionRoot)依赖关系。但是,请注意,依赖DI容器并在类中使用该容器被称为服务位置,并且被认为是反模式。您可能需要考虑更改此的设计。