繁体   English   中英

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

[英]Instantiating a class with injected constructor in C#

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

我要实例化的类:

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创建了一个无参数的构造函数,它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);
        }
    }
}

使用构造函数注入。

如果您不AdminArticleTags每次都获取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. 您在示例中所做的不是注射。 只是一个简单的实例。 此外,由于未定义空或默认构造函数,因此无法编译代码。

也许,如果您提供有关您要实现的更多详细信息,则可以特别轻松地提供帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM