【发布时间】:2015-05-27 19:27:25
【问题描述】:
这些天我经常面临这种情况,我正在寻找一个优雅的解决方案。我有:
public abstract class TypeA
{
public abstract void AbtractMethod(IDependency dependency);
}
public class TypeB : TypeA
{
public override void AbtractMethod(ISpecializedDependencyForB dependency) { }
}
public class TypeC : TypeA
{
public override void AbtractMethod(ISpecializedDependencyForC dependency) { }
}
public interface IDependency { }
public interface ISpecializedDependencyForB : IDependency { }
public interface ISpecializedDependencyForC : IDependency { }
我的目标是让事情在客户端的角度变得透明,并像这样使用这段代码:
TypeA myDomainObject = database.TypeARepository.GetById(id); // The important point here is that I don't know if the object is of TypeB or TypeC when I consume it.
IDependency dependency = ? // How do I get the right dependency
myDomainObject.AbtractMethod(dependency);
所以问题是,由于我不知道对象的具体类型,我无法将正确的依赖项注入其中。
我目前正在做的是创建一个抽象工厂,以注入正确的属性。我有两个问题,第一个是我最终会拥有很多工厂。第二个是它使多态性变得无用,因为客户端实际上需要关心“管理”底层类型(我需要在工厂中注入所有可能的依赖项,并在客户端代码上实例化工厂)。
1) 因此,我正在考虑使用统一的属性注入,但是在手动实例化对象之后,我无法确定是否可以解决对象的依赖关系。即使采用这种方法,我认为我仍然会遇到同样的问题:我不确定如果存在这样的语法,unity 是否会检查对象的实际类型并解决正确的依赖关系:
unityContainer.Resolve<TypeA>(myDomainObject)
如果没有,我需要提前知道类型并且会回到同样的问题。
2)我发现这篇文章提到EF为DI提供了一些机制,但它似乎只是为了注入框架服务(PluralizationService等......)。否则,这将是实现这一目标的好方法。
3) 在这种情况下,我也不能使用 DI...从概念上看,DI 似乎不太适合多态性。不过,我对这个想法并不感到兴奋。
我很乐意为我正在尝试实现的属性注入提供解决方案,或者我可以使用的模式的想法。但是,我真的不想为此创建大型基础架构并混淆我的代码。
注意:在这种情况下,我不想让您使用域事件。
谢谢
【问题讨论】:
-
如果方法签名不同(并且基本方法必须是虚拟的),您将无法覆盖。同时,如果子类依赖是针对不同接口的,那么在容器中配置这些应该没有问题吧?
-
哦,是的,您是对的,我在编写示例时忘记了这一点。但实际上没关系,它肯定不会编译,但它指向我想要完成的行为。有一个问题,因为我需要根据类类型手动传递正确的参数,它破坏了我试图通过多态实现的抽象
-
也许我遗漏了一些东西,但你为什么不能使用“is”运算符检查 myDomainObject 的类型?
-
我同意我签入了 vs 并且它不喜欢你的覆盖。但是我想我明白你的意思。你看过命名的依赖吗?
-
好的,依赖对象在哪里?必须对他们有所了解。我想我基本上同意史蒂文的观点——我们需要更多的背景信息,因为这可能不是一个通用的场景
标签: c# oop dependency-injection polymorphism unity-container