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

Instantiating a class with injected constructor in C#

我想知道是否可以创建一个 class 的对象,该对象具有一个构造函数并注入另一个 class.

我要实例化的class:

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
        }
    }
}

我想在另一个class中使用上面class的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

有可能吗?

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

编辑:

我想做的很简单。我只想创建一个 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);
        }
    }
}
  1. 是的。即使 class 具有参数化构造函数,您也可以注入代码。不过,这取决于您注入的方式和方式 technique/framework。

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

也许如果您提供更多关于您正在努力实现的细节,它会更容易具体协助。

使用构造函数注入。

如果你不关心每次都获取一个新的AdminArticleTags实例,那么只需像这样向控制器中注入一个AdminArticleTags

public class Someclass : Controller
{
    private readonly AdminArticleTags m_AdminArticleTags;

    public Someclass(AdminArticleTags aat)
    {
        m_AdminArticleTags = aat;
    }

    public ActionResult Index()
    {
       m_AdminArticleTags.InsertNew(15, 42);
    }
}

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

如果您在 Index 操作中每次都需要一个新实例,那么您需要某种工厂。您可以像这样使用 Func class:

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);
    }
}

在这种情况下,您必须安装 Ninject.Extensions.Factory nuget 包。这将允许支持解析基于 Func 的工厂。看看this.

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