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

本文关键字:一个 实例化 注入 构造函数 | 更新日期: 2023-09-27 18:21:58

我想知道是否可以通过注入另一个类来创建具有构造函数的类的对象。

我想实例化的类:

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对象并使用其方法

编辑2:

这就是我进行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);
        }
    }
}

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

使用构造函数注入。

如果您不关心每次都获得一个新的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类:

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的工厂。看看这个。

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

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

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

也许如果你提供更多关于你正在努力实现的细节,那么具体帮助会更容易。