【问题标题】:I need to bind with Ninject to database and inject them to same repository in same time我需要将 Ninject 绑定到数据库并同时将它们注入到同一个存储库
【发布时间】:2014-09-25 10:04:02
【问题描述】:

这是我的代码的一些部分 NinjectWebCommon 类我需要绑定数据上下文的地方。 它只是一段代码,不是完整的类。

private static void RegisterServices(IKernel kernel)
        {
            kernel.BindSharpRepository();
            RepositoryDependencyResolver.SetDependencyResolver(new NinjectDependencyResolver(kernel));

            kernel.Bind<DbContext>().To<EntitiesDbOne>().InRequestScope();

        //kernel.Bind<DbContext>().To<EntitiesDbTwo>().InRequestScope();
    }  

我需要同时拥有两个数据库的类别存储库类

public class CategoryRepository : ConfigurationBasedRepository<CategoryData, int>, ICategoryRepository
    {
    private readonly EntitiesDbOne _ctxOne;
        private readonly EntitiesDbTwo _ctxTwo;

    public CategoryRepository(EntitiesDbOne ctxOne, EntitiesDbTwo ctxTwo)
        {
            _ctxOne= ctxOne;
            _ctxTwo= ctxTwo;
        }

    public CategoryData GetById(int Id)
        {
             //dummy data, just for usage two different dcContexts
             var category = _ctxOne.Categories.Include((string) (x => x.MetaTags)).FirstOrDefault(x => x.Id == Id);
             var categoryName = _ctxTwo.category.FirstOrDefault(x => x.Id == category.Id);

            return category;
        }

在我的项目中,我使用 SharpRepository(ConfigurationBasedRepository) 并使用 UnitOfWork。我想我可以跳过 UnitOfWork,因为 EntityFramework 正在做所有这些(UnitOfWork 模式)工作。 数据库的展位是 EntityFramework 一个是 CodeFirst 方法 其他 (DbTwo) modelFirst

public class EntitiesDbOne : DbContext
    {
        public DbSet<CategoryData> Categories { get; set; }
}

public partial class EntitiesDbTwo: DbContext
    {
        public EntitiesDbTwo()
            : base("name=EntitiesDbTwo")
        {
        }

        public DbSet<attributenames> attributenames { get; set; }
        public DbSet<category> category { get; set; }
}

请给我一些我可以使用的示例的链接,我认为我无法通过简单的解释来解决这个问题。在我写这个问题之前,我已经在这里搜索了答案 Multiple DbContexts in N-Tier Application

EF and repository pattern - ending up with multiple DbContexts in one controller - any issues (performance, data integrity)?

这个问题在我的情况下是完整的,但对我来说,代码却大不相同。 Multiple dbcontexts with Repository, UnitOfWork and Ninject

这是多个数据库,但每个请求使用一个,我需要在同一个请求中使用两个数据库。 http://blog.staticvoid.co.nz/2012/1/9/multiple_repository_data_contexts_with_my_repository_pattern 网站和其他地方。

我阅读了大约 20 条建议,其中有两条接近我的情况但可能还不够。

【问题讨论】:

  • 我觉得这种需求超出了通用存储库的概念。从 ConfigurationBasedRepository 继承确实给您带来了 2 个好处。首先,您可以更改底层数据存储(从 EfRepository 更改为 InMemoryRepository 或 XmlRepository 以进行测试等),其次您可以从配置文件配置和更改缓存选项。当涉及到使用 2 个 DbContexts 的方法时,我认为您没有获得任何这些好处。就个人而言,我会将其移至单独的课程。在有意义时使用 SharpRepository,但在没有意义时不要尝试强制使用。

标签: c# entity-framework dependency-injection ninject sharp-repository


【解决方案1】:

只是作为讨论的基础:

如果你使用:

kernel.Bind<EntitiesDbOne>().ToSelf().InRequestScope();
kernel.Bind<EntitiesDbTwo>().ToSelf().InRequestScope();

并像使用它一样

public class CategoryRepository : ConfigurationBasedRepository<CategoryData, int>,    ICategoryRepository
{

    public CategoryRepository(EntitiesDbOne ctxOne, EntitiesDbTwo ctxTwo)
    {
    }
}

那有什么问题呢?

【讨论】:

  • 这行不通。你可以看到。第二个绑定被注释掉。 //kernel.Bind().To().InRequestScope();
  • 是的,我可以看到它已被注释掉。但为什么它不起作用?问题是什么?我的意思是这肯定不是一个 ninject 问题,因为绑定工作得很好,那么到底是什么不工作?
  • 这是个好问题:)(为什么它不起作用?),但我不知道。我之前写过,我已经阅读了大约 20 条建议,并且我已经尝试了其中的大部分并得到了 20 个不同的问题。我这个特殊的“来自 Ninject 的 ActivationException,有多个匹配的绑定可用。”这个问题是为那些有相同情况经验或可以模拟类似情况并尝试解决的人准备的。谢谢。
  • 我确实有很多类似场景的经验,尽管不完全相同。如果您更加集中注意力,您会注意到我在“答案”中的建议与您所做的不同。有了你所做的,100% 清楚你会得到ActivationException(多个绑定可用),因为你确实DbContext 创建了两个绑定!然而,我的建议根本不包含DbContext 的绑定,而是(确切地说)一个用于EntitiesDbOne 和一个用于EntitiesDbTwo。综上所述,我建议你调整一下态度。
  • 比,你正是我需要的人。您能否发布一些代码,您可以在其中与 Ninject 两个数据库绑定,我的情况是 EF Code First 其他 Model First 并且可以在一个请求中访问它们。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
  • 1970-01-01
  • 2020-10-15
相关资源
最近更新 更多