根据程序集分配实现

时间:2015-04-21 20:35:20

标签: c# .net structuremap

我在通用基础架构程序集中有几个通用接口和实现。例子:

AlphaRepository<T> : IRepository<T>
BetaRepository<T> : IRepository<T>

我正在开发模块化架构,因此每个子系统都有自己的程序集,可以利用这个公共库。每个存储库都有一个构造函数,它接受一个I​​DbContext。每个子系统都实现并扩展了IDbContext。是否有可能通过结构图执行以下操作:

  • 对于程序集A,For(typeof(IRepository&lt;&gt;))。使用(typeof(AlphaRepository&lt;&gt;)),对AlphabContext使用AlphaContext。
  • 对于程序集B,For(typeof(IRepository&lt;&gt;))。使用(typeof(BetaRepository&lt;&gt;)),使用
    IDbContext的BetaContext

我想将它们分成不同的注册表(即AlphaRegistry和BetaRegistry)。所有这些都将连接到初始化容器的静态IoC类中。

思想?

更新(回应史蒂文的提问):

不一定;我将它们构建为足够灵活,以共享数据库或使用单独的数据库。它们共享一个基本的DbContext:IDbContext。问题是AlphaUnitOfWork接收AlphaContext,然后将其作为IDbContext传递给EfUnitOfWork库。问题是指示结构图在使用Beta程序集类时在Alpha程序集和BetaContext中操作时使用AlphaContext。作为一种解决方法(在这种情况下),我输入了IDbContext然后使用了Forward&gt;()语法。到目前为止工作但我想与其他类(即基于调用汇编的ILogger实现,因此Alpha可以存储在DB中,Beta可以存储在NoSQL中)而不必使它们成为泛型。

1 个答案:

答案 0 :(得分:0)

无论Steven提出的有效观点如何,我认为你可以通过以下方式解决这个问题......

在给定的注册表中,您将DbContextRepository注册为命名实例,其名称与程序集名称相同。问题可能在于命名不适用于开放式通用定义,这是我现在无法检查的。

为了在相应的使用者中注入它们,您将配置哪个命名实例用于某些给定的ctor参数。您可以从刚刚配置的类型的程序集中派生名称。