我可以在没有构造函数或容器的情况下实例化一个类吗?

时间:2015-07-06 15:13:26

标签: c# dependency-injection unity-container

如果我没有容器的句柄,有没有办法在没有构造函数的情况下实例化一个类?

如果我调用container.RegisterType<IMyClass , MyClass>()我知道我可以使用unity来实例化构造函数中的对象。

Someclass(IMyClass myClass)

var s = new Someclass();

我也知道我可以使用 container.Resolve<IMyClass>()在构造函数外部,如果我有容器的句柄,或者使用DependencyFactory,这也是同样的事情。

如果我正在编写一个没有保存容器句柄的大型项目的代码,并且使用构造函数是不合适的,有没有办法使用unity来实现类?

1 个答案:

答案 0 :(得分:2)

您不应该在类中引用容器。你的容器应该编排对象图的构造,你的类不应该调用它,它应该调用你的类。

理想情况下,您的容器不应在Composition Root之外使用。见this answer

I(和Belogix)试图制作的点(看起来不是很好)是如果正确使用DI,则永远不需要直接创建依赖对象。传递容器是一种代码味道,如果可能的话(几乎总是如此)你应该避免这种情况。如果您在某个地方需要一个班级实例,而您没有掌握该容器的句柄。你应该通过你的对象的构造函数来请求该类的实例。这样做允许IoC容器知道您的对象具有依赖关系,然后当容器创建该类的实例时,它可以提供该依赖关系的实例。如果您在链中一直遵循此主体,那么组合根将成为您创建对象所需的唯一位置,并且您可以手动执行(poor man's DI),或者您可以配置容器为你做。

我建议你阅读this post它确实帮助我理解了组合根的概念,以及为什么不在整个应用程序中泄漏容器是一个好主意。

如果你想在不调用构造函数的情况下创建一个对象而没有容器的句柄,那么你可以在GetUnitializedObject中使用this answer,但你必须问自己,如果你正在游泳那个在上游努力创造你的物体,肯定有一个更好的方法吗?

我只想指出我认为目前公认的使用容器的最佳做法。