在 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);
}
}
}
是的。即使 class 具有参数化构造函数,您也可以注入代码。不过,这取决于您注入的方式和方式 technique/framework。
您在示例中所做的不是注入。只是一个简单的实例化。此外,您的代码将无法编译,因为您没有定义空构造函数或默认构造函数。
也许如果您提供更多关于您正在努力实现的细节,它会更容易具体协助。
使用构造函数注入。
如果你不关心每次都获取一个新的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.
我想知道是否可以创建一个 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);
}
}
}
是的。即使 class 具有参数化构造函数,您也可以注入代码。不过,这取决于您注入的方式和方式 technique/framework。
您在示例中所做的不是注入。只是一个简单的实例化。此外,您的代码将无法编译,因为您没有定义空构造函数或默认构造函数。
也许如果您提供更多关于您正在努力实现的细节,它会更容易具体协助。
使用构造函数注入。
如果你不关心每次都获取一个新的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.