子类MVC中的依赖注入

时间:2017-10-29 13:46:48

标签: asp.net-mvc dependency-injection subclass superclass

给出一个班级

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对象。

1 个答案:

答案 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