具体类型应该如何以松散耦合的方式返回接口的实例?

问题描述 投票:0回答:1

我有一个

IDirectory
接口和一个实现它的
Directory
类。
我需要创建一个
IDirectoryEnumerator
,它只有一个如下所示的方法:

IEnumerable<IDirectory> GetDirectories();

所以我创建了一个

DirectoryEnumerator
类,但我不确定要在
IDirectory
中返回哪个
GetDirectories()
,因为我想保持我的代码松散耦合

我应该以某种方式使用带有

IDirectory
约束的泛型吗?
我应该通过 DI 容器以某种方式获取它吗?
类似的东西应该紧密耦合吗?我应该专注于特定的具体类型吗?
或者还有其他更好的选择吗?

注意:在我的示例中,

IDirectory
的具体类型没有任何默认构造函数并且是不可变的。

c# design-patterns dependency-injection inversion-of-control loose-coupling
1个回答
1
投票

您可以让具体的

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 IEnumerable<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 ...
}
© www.soinside.com 2019 - 2024. All rights reserved.