使用 C# 进行依赖注入 - 在哪里加载已解析对象的数据
Dependency Injection with C# - Where to load the data for the Resolved Objects
快速依赖注入/IoC 容器问题,对于经验丰富的开发人员来说,这有望成为一个简单的问题。我是 DI 的新手,并且掌握了注册类型和解析它们以使用构造函数注入构建实例的过程的基础知识,但对使用数据加载实例的过程和 when/where 做的过程有疑问正确。
因此,如果您有一个已解析为使用 DI 容器构建对象的对象 - 它将加载一个空心对象,但您应该在什么时候加载该对象及其所需的数据?
例如:
如果您有一个由 Student class 和 Principal class 实现的 IPerson 接口。您有一个由 SiteVisit 实现的 ISiteVisit 接口,您按以下方式解析:
var dictr = new UnityContainer();
dictr.RegisterType<IPerson, Principal>();
dictr.RegisterType<IVisitSite, SiteVisit>();
var siteVisit = dictr.Resolve<IVisitSite>();
siteVisit.Visit();
您将在哪里加载个人的详细信息(在示例中 class 是:委托人)以获取名字、姓氏、电话号码、地址等数据 - 与个人相关的任何内容?它会在构造函数中加载吗?如果不是,加载它的最佳位置是什么?最佳约定 and/or 最佳实践?
理想情况下,您应该对应用程序中的每个接口使用依赖注入,还是仅对某些模型使用依赖注入?
使用依赖注入时如何将数据加载到已解析的对象中?
环境:Visual Studio 2015,C#,用于 DI / 容器的 Unity(使用控制台应用程序对此进行测试)
我通常使用 Factory 模式或 Repository 模式来处理创建和维护诸如 Person 之类的实体。
我通常使用依赖注入来编写实现这些模式的服务类。
例如:
var dictr = new UnityContainer();
dictr.RegisterType<IPersonFactory, PersonFactory>();
dictr.RegisterType<IVisitSite, SiteVisit>();
var personFactory = dictr.Resolve<IPersonFactory>();
IPerson person = personFactory.CreatePrincipal(your args here);
var siteVisit = dictr.Resolve<IVisitSite>();
siteVisit.Visit(person);
希望对您有所帮助。
依赖注入是组合松散耦合组件图的实践。组件是应用程序中包含其 行为 的 classes。
依赖注入并不意味着构建仅包含数据的对象。使用依赖注入,我们构建了一个 components 的图表。在构建该图(使用构造函数注入)后,我们通过对该构建的对象图进行方法调用来传递运行时数据。
你的 Person
class 是 清楚地 运行时数据 因为它包含像 FirstName
这样的数据和 LastName
。人不是组件(它不包含行为)。它是数据传输对象 (DTO) 或实体。尽管实体可能包含行为(在实践 Domain-Driven 设计时),但此行为绝不会隐藏在抽象背后,因为这是应用程序其余部分构建的逻辑。
所以加载实体的典型方法是使用 Repository Pattern。存储库是一个组件,它能够加载和保存某种实体。例如:
public interface IPersonRepository
{
Person GetById(Guid id);
}
public class SqlPersonRepository : IPersonRepository
{
public GetById(Guid id) => // implementation here
}
现在我们可以注册这个组件如下:
container.RegisterType<IPersonRepository, SqlPersonRepository>();
快速依赖注入/IoC 容器问题,对于经验丰富的开发人员来说,这有望成为一个简单的问题。我是 DI 的新手,并且掌握了注册类型和解析它们以使用构造函数注入构建实例的过程的基础知识,但对使用数据加载实例的过程和 when/where 做的过程有疑问正确。
因此,如果您有一个已解析为使用 DI 容器构建对象的对象 - 它将加载一个空心对象,但您应该在什么时候加载该对象及其所需的数据?
例如: 如果您有一个由 Student class 和 Principal class 实现的 IPerson 接口。您有一个由 SiteVisit 实现的 ISiteVisit 接口,您按以下方式解析:
var dictr = new UnityContainer();
dictr.RegisterType<IPerson, Principal>();
dictr.RegisterType<IVisitSite, SiteVisit>();
var siteVisit = dictr.Resolve<IVisitSite>();
siteVisit.Visit();
您将在哪里加载个人的详细信息(在示例中 class 是:委托人)以获取名字、姓氏、电话号码、地址等数据 - 与个人相关的任何内容?它会在构造函数中加载吗?如果不是,加载它的最佳位置是什么?最佳约定 and/or 最佳实践?
理想情况下,您应该对应用程序中的每个接口使用依赖注入,还是仅对某些模型使用依赖注入?
使用依赖注入时如何将数据加载到已解析的对象中?
环境:Visual Studio 2015,C#,用于 DI / 容器的 Unity(使用控制台应用程序对此进行测试)
我通常使用 Factory 模式或 Repository 模式来处理创建和维护诸如 Person 之类的实体。
我通常使用依赖注入来编写实现这些模式的服务类。
例如:
var dictr = new UnityContainer();
dictr.RegisterType<IPersonFactory, PersonFactory>();
dictr.RegisterType<IVisitSite, SiteVisit>();
var personFactory = dictr.Resolve<IPersonFactory>();
IPerson person = personFactory.CreatePrincipal(your args here);
var siteVisit = dictr.Resolve<IVisitSite>();
siteVisit.Visit(person);
希望对您有所帮助。
依赖注入是组合松散耦合组件图的实践。组件是应用程序中包含其 行为 的 classes。
依赖注入并不意味着构建仅包含数据的对象。使用依赖注入,我们构建了一个 components 的图表。在构建该图(使用构造函数注入)后,我们通过对该构建的对象图进行方法调用来传递运行时数据。
你的 Person
class 是 清楚地 运行时数据 因为它包含像 FirstName
这样的数据和 LastName
。人不是组件(它不包含行为)。它是数据传输对象 (DTO) 或实体。尽管实体可能包含行为(在实践 Domain-Driven 设计时),但此行为绝不会隐藏在抽象背后,因为这是应用程序其余部分构建的逻辑。
所以加载实体的典型方法是使用 Repository Pattern。存储库是一个组件,它能够加载和保存某种实体。例如:
public interface IPersonRepository
{
Person GetById(Guid id);
}
public class SqlPersonRepository : IPersonRepository
{
public GetById(Guid id) => // implementation here
}
现在我们可以注册这个组件如下:
container.RegisterType<IPersonRepository, SqlPersonRepository>();