如何在.net core 2.2控制台应用程序中实现依赖项注入

时间:2019-01-25 16:57:08

标签: c# dependency-injection .net-core

我正在使用.net core 2.2创建一个小型控制台应用程序,并且试图通过我的应用程序实现依赖项注入。 我遇到了一些未处理的异常。

Person.cs

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? Age { get; set; }
    public string Gender { get; set; }
}

IPersonRepository

public interface IPersonRepository
{
     bool AddPerson(Person entity);
     IEnumerable<Person> GetAllPersons();
}

PersonRepository.cs

 public class PersonRepository:IPersonRepository
 {
        private readonly IPersonRepository _personRepository;

        public PersonRepository(IPersonRepository personRepository)
        {
            _personRepository = personRepository;
        }

        public bool AddPerson(Person entity)
        {
            _personRepository.AddPerson(entity);
            return true;
        }

        public IEnumerable<Person> GetAllPersons()
        {
            throw new System.NotImplementedException();
        }
  }

Program.cs

using Microsoft.Extensions.DependencyInjection;

namespace ConsoleAppWithDI
{
    internal static class Program
    {
        private static void Main(string[] args)
        {
            var serviceProvider = new ServiceCollection()
                .AddTransient<IPersonRepository, PersonRepository>()
                .BuildServiceProvider();

            var personRepositoryObj = serviceProvider
                .GetService<IPersonRepository>();

            personRepositoryObj
                .AddPerson(new Person
                {
                    Id = 1,
                    Name = "Tom",
                    Age = 24,
                    Gender = "Male"
                });
        }
    }
}


我得到这个Exception。有人可以告诉我我在哪里犯错吗?我也想知道何时使用DI在控制台应用程序(不运行24 * 7)中制作.exe是安全的?
任何帮助将非常感激。谢谢

2 个答案:

答案 0 :(得分:1)

您的人员存储库采用IPersonRepository,依赖注入器正在尝试创建一个需要注入自身的类。您可能想改用DbContext。此代码假定您已创建名为ApplicationContext

的DbContext。
private readonly ApplicationContext _context;

public PersonRepository(ApplicationContext context)
{
    _context = context;
}

public bool AddPerson(Person entity)
{
    _context.Persons.Add(entity);
    _context.SaveChanges();

    return true;
}

答案 1 :(得分:0)

public PersonRepository(IPersonRepository personRepository)
{
    _personRepository = personRepository;
}

这是您的问题。您需要从构造函数中删除IPersonRepository参数,因为它试图在自身内部创建其自身的实例。因此,您的通函参考问题