[英]How should concrete types return an instance of an interface in a loosely-coupled way?
我有一個IDirectory
接口和一個實現它的Directory
類。
我需要創建一個IDirectoryEnumerator
,它只有一個看起來像這樣的方法:
IEnumerable<IDirectory> GetDirectories();
所以我創建了一個DirectoryEnumerator
類,但是我不確定在GetDirectories()
返回哪個IDirectory
,因為我想保持我的代碼松散耦合 。
我應該以某種方式使用對IDirectory
進行約束的泛型嗎?
我應該通過DI容器以某種方式獲得它嗎?
這樣的事情應該緊密結合嗎,我應該專注於特定的混凝土類型嗎?
還是有另一個更好的選擇?
注意:在我的示例中, IDirectory
具體類型沒有任何默認構造函數,並且是不可變的。
您可以讓具體的IDirectoryEnumerator
實現通過構造函數接受某種工廠(例如IDirectoyFactory
),然后在該工廠中使用參數化的方法來創建IDirectory
具體類型。
這也使測試更加容易,並使您能夠使用DI容器注入依賴項。
例:
public interface IDirectoryEnumerator
{
IEnumerable<IDirectory> GetDirectories();
}
public class DirectoryEnumImpl : IDirectoryEnumerator
{
private readonly IDirectoryFactory _directoryFactory;
public DirectoryEnumImpl(IDirectoryFactory directoryFactory)
{
_directoryFactory = directoryFactory;
}
public IEnumberable<IDirectory> GetDirectories()
{
// you can use the factory here
}
}
public interface IDirectoryFactory
{
IDirectory CreateDirectory(DirectoryType directoryType);
}
public class DirectoryFactoryImpl : IDirectoryFactory
{
IDirectory CreateDirectory(DirectoryType directoryType)
{
if (directoryType == DirectoryType.DIR_A)
return new Dir_A();
// the same goes for other types.
}
}
public enum DirectoryType {
DIR_A, DIR_B, // etc ...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.