快速依赖注入/ 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();
您将在何处加载Person的详细信息(在示例类中是:Principal)以获取诸如FirstName,LastName,PhoneNumber,Address等数据。-与Person相关的任何内容?是否将其加载到构造函数中,如果不是,最好的加载位置,最佳约定和/或最佳实践是什么?
您是否应该在应用程序中的每个接口或某些模型上理想地使用依赖注入?
使用依赖注入时如何将数据加载到解析的对象中?
环境:Visual Studio 2015,C#,Unity for DI /容器(使用控制台应用程序对此进行测试)
最佳答案
依赖注入是组成松耦合组件图的实践。组件是应用程序中包含其行为的类。
依赖注入并不意味着建立仅包含数据的对象。使用依赖注入,我们可以构建组件图。构建完该图(使用构造函数注入)后,我们通过在该构造的对象图上进行方法调用,将运行时数据通过该图。
您的Person
类显然是运行时数据,因为它包含FirstName
和LastName
之类的数据。人不是组成部分(它不包含行为)。它可以是数据传输对象(DTO)或实体。尽管实体可能包含行为(在实践域驱动设计时),但这种行为绝不会隐藏在抽象背后,因为这是应用程序其余部分构建的逻辑。
因此,加载实体的典型方法是使用Repository Pattern。存储库是一个组件,可以加载和保存某种类型的实体。例如:
public interface IPersonRepository
{
Person GetById(Guid id);
}
public class SqlPersonRepository : IPersonRepository
{
public GetById(Guid id) => // implementation here
}
现在我们可以按以下方式注册此组件:
container.RegisterType<IPersonRepository, SqlPersonRepository>();