控制台应用程序中的 Unity Config 错误
Unity Config error in console application
您好,我正在开发使用依赖注入模式的控制台应用程序,我创建了类似
的界面
public interface IRecurringTransactionPlanDataService : IService<RecurringTransactionPlan>
{
IQueryable<RecurringTransactionPlan> RecurringTransactionPlanData();
}
并且 class 实现为
public class RecurringTransactionPlanDataService : Service<RecurringTransactionPlan>, IRecurringTransactionPlanDataService
{
private readonly IRepositoryAsync<RecurringTransactionPlan> _repository;
public RecurringTransactionPlanDataService(IRepositoryAsync<RecurringTransactionPlan> repository)
: base(repository)
{
_repository = repository;
}
public IQueryable<RecurringTransactionPlan> RecurringTransactionPlanData()
{
return _repository.RecurringTransactionPlanData();
}
}
存储库:
public static class RecurringTransactionPlanRepository
{
public static IQueryable<RecurringTransactionPlan> RecurringTransactionPlanData(this IRepository<RecurringTransactionPlan> repository)
{
return repository.Queryable();
}
}
以上代码全部在单独的项目中,我在 MVC 和控制台应用程序中使用它,而在 MVC 中使用时 UnityConfig.cs 从数据库中获取数据没有错误,但在控制台应用程序中我们需要手动注册和解析接口,我已经试过了,
我的控制台应用程序:
public class RecurringTransaction
{
public readonly IRecurringTransactionPlanDataService _recurringTransactionPlanDataService;
public RecurringTransaction()
{
var container = new UnityContainer();
container.RegisterType<IRecurringTransactionPlanDataService, RecurringTransactionPlanDataService>();
_recurringTransactionPlanDataService = container.Resolve<IRecurringTransactionPlanDataService>();
}
}
public class Program
{
public static void Main(string[] args)
{
FeePaymentTracker.UnityConfig.RegisterComponents();
RecurringTransaction rt = new RecurringTransaction();
var restult = rt.GetRecurringTransactionRecords();
}
}
我收到上述错误。期待您的想法解决错误。
在您发布的代码中,您有一个名为 IPaymentService 的接口及其实现。好像还可以但是在屏幕截图中,您正在尝试解决名为 RecurringTransactionPlanDataService 的依赖项。让你知道你已经注册了这个依赖项。您能否添加有关如何在容器中注册依赖项的信息?
您的代码中的问题是您试图解析实现而不是接口。您应该更改以下行:
_recurringTransactionPlanDataService = container.Resolve<RecurringTransactionPlanDataService>();
这样:
_recurringTransactionPlanDataService = container.Resolve<IRecurringTransactionPlanDataService>();
干杯,
在您的 RecurringTransaction
方法中,您创建一个新容器,然后在该新容器中注册 RecurringTransactionPlanDataService
。但是您没有注册实现 RecurringTransactionPlanDataService
具有的依赖项。该容器将只有一个注册。
var container = new UnityContainer();
container.RegisterType<IRecurringTransactionPlanDataService, RecurringTransactionPlanDataService>();
_recurringTransactionPlanDataService = container.Resolve<IRecurringTransactionPlanDataService>();
由于 RecurringTransactionPlanDataService
依赖于 IRepositoryAsync<RecurringTransactionPlan>
,因此您也需要注册它。
将您的代码更改为:
var container = new UnityContainer();
container.RegisterType<IRecurringTransactionPlanDataService, RecurringTransactionPlanDataService>();
container.RegisterType<IRepositoryAsync<RecurringTransactionPlan>, YourRepositoryImplementation>();
_recurringTransactionPlanDataService = container.Resolve<IRecurringTransactionPlanDataService>();
作为旁注,您可能想要重复使用同一个容器。在控制台应用程序中,我通常会解析 "ProgramStarter",然后得到正确的注入。这样你只需要在根目录中使用服务定位器反模式。但可以在应用程序的其余部分使用适当的 DI。
class Program
{
static void Main(string[] args)
{
var container = new UnityContainer();
container.RegisterType<ProgramStarter, ProgramStarter>();
// Pass the same container to the config.
FeePaymentTracker.UnityConfig.RegisterComponents(container);
var program = container.Resolve<ProgramStarter>();
program.Run();
}
}
public class ProgramStarter
{
IRecurringTransactionPlanDataService _dataService;
public ProgramStarter(IRecurringTransactionPlanDataService dataService)
{
_dataService = dataService;
}
public void Run()
{
// Do stuff.
}
}
您好,我正在开发使用依赖注入模式的控制台应用程序,我创建了类似
的界面 public interface IRecurringTransactionPlanDataService : IService<RecurringTransactionPlan>
{
IQueryable<RecurringTransactionPlan> RecurringTransactionPlanData();
}
并且 class 实现为
public class RecurringTransactionPlanDataService : Service<RecurringTransactionPlan>, IRecurringTransactionPlanDataService
{
private readonly IRepositoryAsync<RecurringTransactionPlan> _repository;
public RecurringTransactionPlanDataService(IRepositoryAsync<RecurringTransactionPlan> repository)
: base(repository)
{
_repository = repository;
}
public IQueryable<RecurringTransactionPlan> RecurringTransactionPlanData()
{
return _repository.RecurringTransactionPlanData();
}
}
存储库:
public static class RecurringTransactionPlanRepository
{
public static IQueryable<RecurringTransactionPlan> RecurringTransactionPlanData(this IRepository<RecurringTransactionPlan> repository)
{
return repository.Queryable();
}
}
以上代码全部在单独的项目中,我在 MVC 和控制台应用程序中使用它,而在 MVC 中使用时 UnityConfig.cs 从数据库中获取数据没有错误,但在控制台应用程序中我们需要手动注册和解析接口,我已经试过了,
我的控制台应用程序:
public class RecurringTransaction
{
public readonly IRecurringTransactionPlanDataService _recurringTransactionPlanDataService;
public RecurringTransaction()
{
var container = new UnityContainer();
container.RegisterType<IRecurringTransactionPlanDataService, RecurringTransactionPlanDataService>();
_recurringTransactionPlanDataService = container.Resolve<IRecurringTransactionPlanDataService>();
}
}
public class Program
{
public static void Main(string[] args)
{
FeePaymentTracker.UnityConfig.RegisterComponents();
RecurringTransaction rt = new RecurringTransaction();
var restult = rt.GetRecurringTransactionRecords();
}
}
我收到上述错误。期待您的想法解决错误。
在您发布的代码中,您有一个名为 IPaymentService 的接口及其实现。好像还可以但是在屏幕截图中,您正在尝试解决名为 RecurringTransactionPlanDataService 的依赖项。让你知道你已经注册了这个依赖项。您能否添加有关如何在容器中注册依赖项的信息?
您的代码中的问题是您试图解析实现而不是接口。您应该更改以下行:
_recurringTransactionPlanDataService = container.Resolve<RecurringTransactionPlanDataService>();
这样:
_recurringTransactionPlanDataService = container.Resolve<IRecurringTransactionPlanDataService>();
干杯,
在您的 RecurringTransaction
方法中,您创建一个新容器,然后在该新容器中注册 RecurringTransactionPlanDataService
。但是您没有注册实现 RecurringTransactionPlanDataService
具有的依赖项。该容器将只有一个注册。
var container = new UnityContainer();
container.RegisterType<IRecurringTransactionPlanDataService, RecurringTransactionPlanDataService>();
_recurringTransactionPlanDataService = container.Resolve<IRecurringTransactionPlanDataService>();
由于 RecurringTransactionPlanDataService
依赖于 IRepositoryAsync<RecurringTransactionPlan>
,因此您也需要注册它。
将您的代码更改为:
var container = new UnityContainer();
container.RegisterType<IRecurringTransactionPlanDataService, RecurringTransactionPlanDataService>();
container.RegisterType<IRepositoryAsync<RecurringTransactionPlan>, YourRepositoryImplementation>();
_recurringTransactionPlanDataService = container.Resolve<IRecurringTransactionPlanDataService>();
作为旁注,您可能想要重复使用同一个容器。在控制台应用程序中,我通常会解析 "ProgramStarter",然后得到正确的注入。这样你只需要在根目录中使用服务定位器反模式。但可以在应用程序的其余部分使用适当的 DI。
class Program
{
static void Main(string[] args)
{
var container = new UnityContainer();
container.RegisterType<ProgramStarter, ProgramStarter>();
// Pass the same container to the config.
FeePaymentTracker.UnityConfig.RegisterComponents(container);
var program = container.Resolve<ProgramStarter>();
program.Run();
}
}
public class ProgramStarter
{
IRecurringTransactionPlanDataService _dataService;
public ProgramStarter(IRecurringTransactionPlanDataService dataService)
{
_dataService = dataService;
}
public void Run()
{
// Do stuff.
}
}