[英]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
的工厂的替代方法是工厂接口。 看看这个 。
是。 即使类具有参数化构造函数,也可以注入代码。 但是,这取决于您注入的方式和技术。
您在示例中所做的不是注射。 只是一个简单的实例。 此外,由于未定义空或默认构造函数,因此无法编译代码。
也许,如果您提供有关您要实现的更多详细信息,则可以特别轻松地提供帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.