使用依赖注入创建应用程序时,它使用依赖注入的框架,例如Unity(或Ninject).
如何初始化一起开始将容器的接口注册到容器,并让它们可供应用程序在整个应用程序的运行生命周期中使用?
您是否需要将DI容器传递给可能使用依赖项注入的每个方法,或者是否有某种方法可以使容器全局可访问,以便您可以在开始时将它们全部注册在一起并在运行应用程序时访问它们而无需持续通过它们,并在需要时能够使用它们?
环境:Visual Studio 2015,C#,Microsoft Unity(用于DI容器)
示例代码
static void Main(string[] args)
{
// Make Unity resolve the interface, providing an instance
// of TrivialPursuit class
var diContainer = new UnityContainer();
diContainer.RegisterType<IGame, TrivialPursuit>();
var gameInstance = diContainer.Resolve<IGame>();
var xotherClass = new AnotherClass();
xotherClass.TestOtherClassOtherMethod();
}
Run Code Online (Sandbox Code Playgroud)
------没有依赖注入类上下文的另一个类------
public void TestOtherClassOtherMethod()
{
IGame gameInstance = -- -Container is Not available to resolve from in this class ---
}
Run Code Online (Sandbox Code Playgroud)
原因:我不想将以后可能需要的所有类型传递给我加载的每个类,我只想在需要时使用实例.我进入类越深入,随后应用程序变得越来越复杂,我不想将每个类型的实例从Main()方法传递给每个类.
快速依赖注入/ IoC容器问题,对于经验丰富的开发人员来说,将是一个简单的问题。我是DI的新手,并且掌握了使用类型构造函数注入来注册类型并解析它们以构建实例的过程的基础知识,但是对于用数据加载其实例的过程以及何时何地正确执行操作有疑问。
因此,如果您有一个已解决的问题,可以使用DI容器构建该对象-它会加载一个空心对象,但是您打算在什么时候使用所需的数据来加载该对象?
例如:如果您有一个由Student类和Principal类实现的IPerson接口。并且您有一个由SiteVisit实现的ISiteVisit接口,并以以下方式解析:
var dictr = new UnityContainer();
dictr.RegisterType<IPerson, Principal>();
dictr.RegisterType<IVisitSite, SiteVisit>();
var siteVisit = dictr.Resolve<IVisitSite>();
siteVisit.Visit();
Run Code Online (Sandbox Code Playgroud)
您将在何处加载Person的详细信息(在示例类中是:Principal)以获取诸如FirstName,LastName,PhoneNumber,Address等数据。-与Person相关的任何内容?是否将其加载到构造函数中,如果不是,最好的加载位置,最佳约定和/或最佳实践是什么?
您是否应该在应用程序中的每个接口或某些模型上理想地使用依赖注入?
使用依赖注入时如何将数据加载到解析的对象中?
环境:Visual Studio 2015,C#,Unity for DI /容器(使用控制台应用程序对此进行测试)