簡體   English   中英

Autofac注冊多個接口層次結構,多個具體類

[英]Autofac register multiple interface hierachy, multiple concrete classes

我似乎沒有為我的問題找到答案。 所以,假設有一個接口

public interface IBase {        
void MethodBase();    
}

和一個 class 實現這個,BaseClass 不是抽象的)。 現在我必須有另一個 class 應該實現基本接口但還要添加新方法(擴展默認行為),所以我正在制作這樣的第二個接口

public interface IChild : IBase {        
void MethodChild();    
}

和一個實現這個的 class,比如 ChildClass。

目前一切都很好。 現在是 IoC 和 Autofac 的問題。 我希望在應用程序啟動時有條件地注冊為 IBase(因為該項目已經在其他部分使用 IBase)第一個或第二個具體 class。

問題是,在使用 class 的構造函數中,我是否應該有一個 IBase 類型的參數,並且在它的一種方法中我應該這樣做

(baseTypeParam as IChild)

並使用 IChild 接口添加的新方法之一? 因為如果構造函數參數的類型是 IChild 並且正如我所說,我使用 ChildClass 注冊 IBase 那么一切都會失敗,因為顯然沒有注冊 IChild。

或者我遺漏了一些關於如何使用新方法擴展(設計模式?)基本接口的東西,BaseClass 不應該實現。

您不能將父級強制轉換為子級,因為您不知道 IBase 引用的實現實際上實現了 IChild 方法。 如果您的 class 需要在 IChild 中定義的方法,它應該要求 IChild。

一個更干凈的解決方案是有兩個 IBase 實現,而不是 IChild 從 IBase 繼承。 然后你可以根據你的啟動參數注冊你想要的 IBase 實現,有一個單獨的 class 實現 IChild。

public interface IBase {        
void DoSomething();    
}

public class Base1 : IBase{
public void DoSomething() { \\do something } 
}

public class Base2 : IBase{
public void DoSomething() { \\do something } 
}

public interface IChild{
void DoSomethingElse();
}

public class Child1{
public void DoSomethingElse() { \\do something else }
}

public class IDoSomething{
public IDoSomething(IBase base){}
}

public class IDoMoreThings{
public IDoMoreThings(IBase base, IChild child){}
}

我知道 IChild 從 IBase 繼承可能是有意義的,但如果沒有更多上下文,我真的不能說。

希望我能正確理解你的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM