C# 我如何向班级灌输信息技术';使用Ninject创建依赖关系
在我的MVC应用程序中,我有一个“计划作业”的概念 作业从接口继承,然后(通过反射)在应用程序启动时自动注册 现在,在我的应用程序中,我使用Ninject for DI来帮助使我的控制器更易于单元测试。我也希望使用ninject来完成我的计划作业,但目前我正在使用“穷人的DI”来实例化我的作业及其依赖项 那么,我应该如何使用Ninject而不是可怜的人的DI呢 作业界面:C# 我如何向班级灌输信息技术';使用Ninject创建依赖关系,c#,asp.net,asp.net-mvc,dependency-injection,ninject,C#,Asp.net,Asp.net Mvc,Dependency Injection,Ninject,在我的MVC应用程序中,我有一个“计划作业”的概念 作业从接口继承,然后(通过反射)在应用程序启动时自动注册 现在,在我的应用程序中,我使用Ninject for DI来帮助使我的控制器更易于单元测试。我也希望使用ninject来完成我的计划作业,但目前我正在使用“穷人的DI”来实例化我的作业及其依赖项 那么,我应该如何使用Ninject而不是可怜的人的DI呢 作业界面: public interface IScheduledJob { /// <summary> /
public interface IScheduledJob
{
/// <summary>
/// Use Cron method to return frequency expression
/// </summary>
string Frequency { get; }
/// <summary>
/// The entry point of the Job
/// </summary>
void DoWork();
}
公共接口是计划作业
{
///
///使用Cron方法返回频率表达式
///
字符串频率{get;}
///
///作业的入口点
///
无效销钉();
}
作业初始化代码:
private void ConfigureSchedules(IAppBuilder app)
{
// Get all types that implement the scheduler interface
IEnumerable<Type> jobs = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => typeof(IScheduledJob).IsAssignableFrom(p) && !p.IsInterface);
foreach (var jobType in jobs)
{
// Create instance of job
IScheduledJob job = (IScheduledJob)Activator.CreateInstance(jobType);
// Add to schedule
RecurringJob.AddOrUpdate(() => job.DoWork(), job.Frequency);
}
}
private void配置计划(IAppBuilder应用程序)
{
//获取实现调度器接口的所有类型
IEnumerable作业=AppDomain.CurrentDomain.GetAssemblys()
.SelectMany(s=>s.GetTypes())
其中(p=>typeof(IScheduledJob).IsAssignableFrom(p)&&!p.IsInterface);
foreach(作业中的var作业类型)
{
//创建作业实例
IsScheduledJob job=(IsScheduledJob)Activator.CreateInstance(jobType);
//添加到时间表中
RecurringJob.AddOrUpdate(()=>job.DoWork(),job.Frequency);
}
}
计划的作业执行器:
public class SynchronizerScheduledJob : IScheduledJob
{
#region Private Members
private IMagentoSoapService _magentoSoapService;
private IMagentoSoapCredentialProvider _credsProvider;
private IUnitOfWork _unitOfWork;
private IOrderHubService _orderHubService;
#endregion
#region Ctors
public SynchronizerScheduledJob(
IMagentoSoapService service,
IMagentoSoapCredentialProvider credsProvider,
IUnitOfWork unitOfWork,
IOrderHubService orderHubService)
{
_magentoSoapService = service;
_credsProvider = credsProvider;
_unitOfWork = unitOfWork;
_orderHubService = orderHubService;
}
/// <summary>
/// Poor man's DI Ctor
/// </summary>
public SynchronizerScheduledJob() : this(
new MagentoSoapService(),
new MagentoSoapCredentialProvider(),
new UnitOfWork(AppDbContext.Create()),
new OrderHubService())
{ }
}
公共类同步器ScheduledJob:IsScheduledJob
{
#区域私人成员
私有IMagentoSoapService _magentoSoapService;
私人影像SOAPCredentialProvider\u CredentialProvider;
私人工作单位;
专用IOrderHubService _orderHubService;
#端区
#区域系数
公共同步器ScheduledJob(
影像服务,
IMagentoSoapCredentialProvider credsProvider,
i工作单元工作单元,
IORDerHUB服务订单HUB服务)
{
_magentoSoapService=服务;
_credsProvider=credsProvider;
_unitOfWork=unitOfWork;
_orderHubService=orderHubService;
}
///
///可怜的人
///
公共同步器ScheduledJob():此(
新建MagentoSoapService(),
新的MagentoSoapCredentialProvider(),
新建UnitOfWork(AppDbContext.Create()),
新建OrderHubService())
{ }
}
您在哪里卡住了?如果您不知道如何操作,您可能需要阅读“如何输入”。@Win我在实际尝试实例化通过反射找到的具有依赖项的类的实例时遇到了问题。控制器是自动完成的,这很好,但我如何做到:a)找出类可能具有哪些依赖项,然后b)将这些依赖项注册到ninject以初始化类。我已经浏览了整个网站和github,但是我很难找到我的用例的例子。可怜人的DI使它变得简单,但我想知道Ninject的等价物是什么。a和b是IoC容器(Ninject)的职责。您所要做的就是注册这些依赖项,IoC容器将为您的.OK解决它。那么,注册依赖项以及实现IsScheduledJob接口的任何程序集?一旦我做到了这一点,我在设置job runner时是否会将ninject视为服务定位器?ie从ninject获取我的接口的所有实现,并将它们添加为定期作业。您在哪里遇到了问题?如果您不知道如何操作,您可能需要阅读“如何输入”。@Win我在实际尝试实例化通过反射找到的具有依赖项的类的实例时遇到了问题。控制器是自动完成的,这很好,但我如何做到:a)找出类可能具有哪些依赖项,然后b)将这些依赖项注册到ninject以初始化类。我已经浏览了整个网站和github,但是我很难找到我的用例的例子。可怜人的DI使它变得简单,但我想知道Ninject的等价物是什么。a和b是IoC容器(Ninject)的职责。您所要做的就是注册这些依赖项,IoC容器将为您的.OK解决它。那么,注册依赖项以及实现IsScheduledJob接口的任何程序集?一旦我做到了这一点,我在设置job runner时是否会将ninject视为服务定位器?ie从ninject获取我的接口的所有实现,并将它们添加为定期作业。