簡體   English   中英

具體類型應該如何以松散耦合的方式返回接口的實例?

[英]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.

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