C# 这可以看作是一种简单的依赖注入形式吗?

C# 这可以看作是一种简单的依赖注入形式吗?,c#,dependency-injection,C#,Dependency Injection,在重新分解一个项目时,我的目标不是让它依赖于一个具体的类型,而是它的一个抽象,我一直面临着一个问题,我需要添加一个对我不想添加的项目的引用 因此,我草拟了以下一段代码,这段代码运行得非常好: 用法: // Old line of code that directly referenced AudioStream // AudioStream = new AudioStream(value); // New code that tries to find a concrete implement

在重新分解一个项目时,我的目标不是让它依赖于一个具体的类型,而是它的一个抽象,我一直面临着一个问题,我需要添加一个对我不想添加的项目的引用

因此,我草拟了以下一段代码,这段代码运行得非常好:

用法:

// Old line of code that directly referenced AudioStream
// AudioStream = new AudioStream(value);

// New code that tries to find a concrete implementation of IAudioStream
var type = typeof(IAudioStream);
var implementation = TryFindImplementation<IAudioStream>();
if (implementation == null)
    throw new InvalidOperationException(
        "Could not find an implementation of " + type.Name);
var instance = Activator.CreateInstance(implementation, value);
AudioStream = (IAudioStream)instance;
//直接引用AudioStream的旧代码行
//AudioStream=新的AudioStream(值);
//试图找到IAudioStream的具体实现的新代码
变量类型=类型(IAudioStream);
var implementation=TryFindImplementation();
if(实现==null)
抛出新的InvalidOperationException(
找不到“+type.Name”的实现;
var instance=Activator.CreateInstance(实现,值);
AudioStream=(IAudioStream)实例;
试图找到具体实现的方法:

private static Type TryFindImplementation<T>()
{
    return (    
        from assembly in AppDomain.CurrentDomain.GetAssemblies()
        from type in assembly.GetTypes()
        where typeof(T).IsAssignableFrom(type)
        where type != typeof(T)
        select type)
        .FirstOrDefault();
}
私有静态类型TryFindImplementation()
{
报税表(
来自AppDomain.CurrentDomain.GetAssemblys()中的程序集
来自程序集中的类型。GetTypes()
其中typeof(T).IsAssignableFrom(type)
其中类型!=类型(T)
选择类型)
.FirstOrDefault();
}

这段代码可以被认为是一种非常简单的依赖注入形式吗?

不。这并不简单,它相当先进。简单的方法是将
AudioStream
作为参数传递到方法中

您的代码可以被看作是一个简单的依赖注入框架——在我看来,它们已经足够多了,您不需要自己编写。

它看起来像是一个有限的实现<如果您尝试实例化的类型没有默认构造函数,code>Activator.CreateInstance将引发异常。任何合适的容器都可以处理此功能,并且可以对所有类型使用构造函数注入

如果您不能或不想使用DI容器,请确保它经过良好测试。

取而代之的是,考虑将<代码> iAddioStuts<代码>依赖项或其工厂注入到客户端代码中。

public class AudioStreamClient
{
    private readonly IAudioStream audioStream;

    public AudiStreamClient(IAudioStream audioStream)
    {
        this.audioStream = audioStream;
    }

    public void DoStuff()
    {
        // use this.audioStream here...
    }
}

可选的,如果您需要一个新的实例<代码> iAdioSoos >每次<代码> DoStuff <代码>执行,考虑.< /P>


但是,请注意,这可能是一个泄漏的抽象,更好的替代方法是。

这看起来更像一个服务定位器,而不是依赖注入。简单有效,现在我让用户通过任何具体的实现,这不再是组件的问题,它实际上解决了一个即将到来的问题:如何传递不一定代表本地文件的音频流?谢谢顺便说一下,这是一个很好的链接:D