Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具体类型应该如何以松散耦合的方式返回接口实例?_C#_Design Patterns_Dependency Injection_Inversion Of Control_Loose Coupling - Fatal编程技术网

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

C# 具体类型应该如何以松散耦合的方式返回接口实例?,c#,design-patterns,dependency-injection,inversion-of-control,loose-coupling,C#,Design Patterns,Dependency Injection,Inversion Of Control,Loose Coupling,我有一个I目录接口和一个实现它的目录类。 我需要创建一个IDirectoryEnumerator,它的方法如下所示: IEnumerable<IDirectory> GetDirectories(); IEnumerable getDirectory(); 因此,我创建了一个DirectoryEnumerator类,但我不确定在GetDirectories()中返回哪个IDirectory,因为我想保持代码松散耦合 我是否应该以某种方式使用带有约束的泛型来IDirectory?

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

IEnumerable<IDirectory> GetDirectories();
IEnumerable getDirectory();
因此,我创建了一个
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 ...
}
公共接口IDirectoryEnumerator
{
IEnumerable getDirectory();
}
公共类DirectoryEnumImpl:IDirectoryEnumerator
{
私有只读IDirectoryFactory\u directoryFactory;
公共目录EnumImpl(IDirectoryFactory目录工厂)
{
_directoryFactory=directoryFactory;
}
公共IEnumberable getDirectory()
{
//你可以使用这里的工厂
}
}
公共接口IDirectoryFactory
{
IDirectory CreateDirectory(DirectoryType DirectoryType);
}
公共类DirectoryFactoryImpl:IDirectoryFactory
{
IDirectory CreateDirectory(DirectoryType DirectoryType)
{
if(directoryType==directoryType.DIR\u A)
返回新的Dir_A();
//其他类型也一样。
}
}
公共枚举目录类型{
目录A,目录B,//等等。。。
}

这是已知的模式吗?还有,
IDirectoyFactory
看起来怎么样?@Ken工厂模式是众所周知的。我已经编辑了我的答案,请检查编辑。因此,最终目录工厂与目录实现紧密耦合?@Ken,在您的情况下,您无法避免这一点。有人必须创建
IDirectory
的实例,因为它们不能被注入。什么是
目录
,为什么要在其上实现该接口?
IDictionary
是否会有更多的实现,您是想在这个界面后面隐藏行为还是只隐藏数据?@Steven目前只有一个
目录
和一个
设计目录
,用于WPF的可混合性。但无论哪种方式,这都将允许我以意想不到的方式扩展我的软件,所以在我看来这是非常重要的。这个界面也有一个行为。