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的可混合性。但无论哪种方式,这都将允许我以意想不到的方式扩展我的软件,所以在我看来这是非常重要的。这个界面也有一个行为。