在C#中使用注入的构造函数实例化一个类

时间:2015-11-15 21:39:05

标签: c# asp.net-mvc-5 ninject

我想知道是否有可能使一个类的对象具有一个注入另一个类的构造函数。

我想要实例化的课程:

using ClearBlog.IRepository;
using ClearBlog.Models;

namespace ClearBlog.Areas.Admin.Classes
{
    public class AdminArticleTags
    {
        private readonly IGenericRepository<ArticleTag> _db = null;

        public AdminArticleTags(IGenericRepository<ArticleTag> db)
        {
            _db = db;
        }

        public int InsertNew(int article, int tag)
        {
            // do smt here
        }
    }
}

我想在另一个类中使用上述类的InsertNew方法,如下所示:

using System.Linq;
using System.Web.Mvc;
using ClearBlog.Models;
using ClearBlog.Helpers;
using ClearBlog.IRepository;
using ClearBlog.Areas.Admin.Classes;

namespace ClearBlog.Areas.Admin.Controllers
{
    public class Someclass : Controller
    {
        private readonly IGenericRepository<Tag> _db = null;

        public Someclass(IGenericRepository<Tag> db)
        {
            _db = db;
        }

        public ActionResult Index()
        {
            AdminArticleTags at = new AdminArticleTags();
            at.InsertNew(10, 15);
        }
     }
 }

现在这是不可能的,因为构造函数期望IGenericRepository

甚至可能吗?

如果不是,那么您推荐什么方式?请注意,我需要使用IGenericRepository这是Ninject用来绑定到实现的接口。

修改

我想做的事情非常简单。我只想制作AdminArticleTags的对象并在Someclass内访问它的方法。即使我为AdminArticlesTags创建一个无参数构造函数,它也会产生错误,因为它不会为该对象注入IGenericRepository。 (因为构造函数)

我如何制作AdminArticlesTags的对象并使用其方法?

EDIT2:

这是我做Ninject绑定的地方:

using Ninject;
using System;
using System.Collections.Generic;
using System.Web.Mvc;
using ClearBlog.IRepository;
using ClearBlog.Repository;
using AutoMapper;

namespace ClearBlog.Infrastructure
{
    public class NinjectDependencyResolver : IDependencyResolver
    {
        private IKernel kernel;
        public NinjectDependencyResolver(IKernel kernelParam)
        {
            kernel = kernelParam;
            AddBindings();
        }
        public object GetService(Type serviceType)
        {
            return kernel.TryGet(serviceType);
        }
        public IEnumerable<object> GetServices(Type serviceType)
        {
            return kernel.GetAll(serviceType);
        }
        private void AddBindings()
        {
            kernel.Bind(typeof(IGenericRepository<>)).To(typeof(GenericRepository<>));
            kernel.Rebind<IMappingEngine>().ToMethod(context => Mapper.Engine);
        }
    }
}

2 个答案:

答案 0 :(得分:3)

使用构造函数注入。

如果您不关心每次都获取argv的新实例,那么只需将AdminArticleTags注入控制器,如下所示:

AdminArticleTags

由于您使用的是Ninject,因此可以创建控制器并传递正确的依赖关系。

如果您在public class Someclass : Controller { private readonly AdminArticleTags m_AdminArticleTags; public Someclass(AdminArticleTags aat) { m_AdminArticleTags = aat; } public ActionResult Index() { m_AdminArticleTags.InsertNew(15, 42); } } 操作中每次都需要一个新实例,那么您需要某种工厂。您可以像这样使用Index类:

Func

在这种情况下,您必须安装Ninject.Extensions.Factory nuget包。这将允许解析基于public class Someclass : Controller { private readonly Func<AdminArticleTags> m_AdminArticleTagsFactory; public Someclass(Func<AdminArticleTags> factory) { m_AdminArticleTagsFactory = factory; } public ActionResult Index() { AdminArticleTags at = m_AdminArticleTagsFactory(); at.InsertNew(15, 42); } } 的工厂。看看this

基于Func的工厂的替代方案是工厂接口。看看this

答案 1 :(得分:0)

  1. 是肯定的。即使类具有参数化构造函数,您也可以注入代码。但是,这取决于你注射的方式和技术/框架。

  2. 您在示例中所做的不是注射。只是一个简单的instanciation。此外,您的代码将无法编译,因为您没有定义空的或默认的构造函数。

  3. 也许如果你提供更多有关你的信息,试图实现它将更容易协助。