2017-04-19 54 views
1

我有兩個派生DbContext類型在我的應用程序註冊多個的DbContext:使用簡單注射器

  • MyDbContext映射到我可以控制
  • ExternalDbContext數據庫映射到我無法控制數據庫(這一個新的和需要添加)

在應用程序中我還使用了Decorator pattern在那裏我有一個SaveChangesDecorator類封裝業務邏輯。這個裝飾者注入了一個DbContext類型,並調用其上的.SaveChanges()方法。

public class SaveChangesDecorator : IWhatever 
{ 
    private readonly DbContext dbContext; 
    private readonly IWhatever decoratee; 

    public SaveChangesDecorator(DbContext dbContext, ...) 
    { 
     this.dbContext = dbContext; 
     ... 
    } 

    public void Whatever() 
    { 
     this.decoratee.Whatever() 
     this.dbContext.SaveChanges(); 
    } 
} 

現在,它取決於哪個(或兩者)派生的DbContext被注入業務邏輯的用例。我有以下登記:

var databaseContextRegistration = scopedLifestyle.CreateRegistration(
    () => new MyDbContext(connectionString), container); 

container.AddRegistration(typeof(MyDbContext), databaseContextRegistration); 
container.AddRegistration(typeof(DbContext), databaseContextRegistration); 

現在我不能添加ExternalDbContext來登記,因爲那將是不明確的。最好的選擇是將DbContext註冊爲此場景的集合嗎?

回答

2

現在我無法將ExternalDbContext添加到註冊中,因爲那樣會不明確。

註冊ExternalDbContextDbContext不僅是您的註冊曖昧,它是在你的應用程序不明確,因爲這取決於DbContextLiskov Substitution Principle違規,假設ExternalDbContext有不同的模式。

如果它具有不同的模式,那麼使用DbContext並期望您的「正常」數據庫的類將會因爲使用ExternalDbContext而提供它們而中斷。

這通常意味着你給每個上下文自己的'接口',這是你已經做的。因此,我的建議是丟失DbContext註冊並只註冊ExternalDbContextMyDbContext,並在您的裝飾器中注入兩個實例。

+0

這樣直白的建議。 – QuantumHive

相關問題