控制台应用程序中的 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.
    }
}