给出一个班级
public class TopicPost : ForumBase
{
}
及其超类
public class ForumBase
{
}
我希望能够在我的超类上执行依赖注入,因此它变为:
public class ForumBase
{
protected IUserUtilities _userUtilities;
public ForumBase(IUserUtilities userUtilities)
{
_userUtilities = userUtilities;
}
}
现在,在我的Subclass(TopicPost)中,我必须添加一个类似的构造函数:
public class TopicPost : ForumBase
{
public TopicPost(IUserUtilities userUtilities) : base(userUtilities)
{
}
}
这最终意味着当我实例化TopicPost时,我必须这样做:
TopicPost post = new TopicPost(new UserUtilities());
我的理解是,如果我使用依赖注入,我想不必'new'up up userUtilities对象。
如果我必须自己实例化对象,是否有任何意义使用DI?我最终不想将实例化工作留给我的容器吗?这不是DI的全部意义吗?
编辑:
澄清一下,我通过从EF调用中选择它来实例化TopicPost:
var topic = query.Select(t => new TopicPost
{
TopicId = (int)t.TopicId,
ContentId = t.ForumTopic.ContentId,
Body = t.ForumTopic.ForumContent.Body,
GravatarHash = t.ForumTopic.ForumContent.AspNetUser.Email
}).FirstOrDefault();
在这种情况下,我无法在实例化中传递UserUtilities对象。
答案 0 :(得分:0)
通常将这些依赖项注入实体类没有多大意义。他们应该只是愚蠢的POCO。
使用依赖注入,您不应该尝试新建对象(除了为类编写单元测试的情况)。您的依赖注入框架将在您需要该对象的任何地方注入您的接口实现,基于接口 - >您提供给框架的实施注册。
例如,如果您要使用Unity框架,您将注册您的interface->实现映射,如下所示
id BedRoomColor DiningRoomColor
----------- ------------------ ---------------
1 yellow red
2 blue pink
3 white grey
4 green NULL
您将在global.asax.cs中的Application_start事件中调用此Bootstraper
public class Bootstrapper
{
public static IUnityContainer Initialise()
{
var container = BuildUnityContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
return container;
}
private static IUnityContainer BuildUnityContainer()
{
var container = new UnityContainer();
container.RegisterType<IUserUtilities , UserUtilities >();
container.RegisterType<IUserRepository, UserRepository>();
RegisterTypes(container);
return container;
}
public static void RegisterTypes(IUnityContainer container)
{
}
}
现在,无论您希望实现protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
Bootstrapper.Initialise(); // Call the bootrstraper
}
,都可以使用构造函数注入
IUserUtilities