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