使用 Simple Injector 注入 Web 时未注册参数 api Controller Constructor

Parameter not registered when using Simple Injector to inject into an web api Controller Constructor

当前出现以下错误

The constructor of type ChurchController contains the parameter with name 'churchService' and type IChurchService that is not registered. Please ensure IChurchService is registered, or change the constructor of ChurchController.

我正在使用 Simple Injector 但我是 IOC 的新手,不确定错误消息的含义或我做错了什么我在下面包含了我的代码

SimpleInjectorWebApiInitializer.cs

 public static class SimpleInjectorWebApiInitializer
    {
        public static void Initialize()
        {
            var container = new Container();
            container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();

            InitializeContainer(container);

            container.RegisterWebApiControllers(GlobalConfiguration.Configuration);

            container.Verify();

            GlobalConfiguration.Configuration.DependencyResolver =
                new SimpleInjectorWebApiDependencyResolver(container);
        }

        private static void InitializeContainer(Container container)
        {
            // For instance:
            container.Register(typeof(IRepository<>), typeof(EFRepository<>));


        }

    }
 public interface IRepository<T> where T : class
    {
        //To query using LINQ
        IQueryable<T> GetAll();

        //Returning Movie or Review by id
        T GetById(int id);

        //Adding Movie or Review
        void Add(T entity);

        //Updating Movie or Review
        void Update(T entity);

        //Deleting Moovie or Review
        void Delete(T entity);

        //Deleting Movie or Review by id
        void Delete(int id);

    }

public class EFRepository<T> : IRepository<T> where T : class
{
    public EFRepository(DbContext dbContext)
    {
        if (dbContext == null)
            throw new ArgumentNullException("dbContext");
        DbContext = dbContext;
        DbSet = DbContext.Set<T>();
    }

    protected DbContext DbContext { get; set; }
    protected DbSet<T> DbSet { get; set; }
    public virtual IQueryable<T> GetAll()
    {
        return DbSet;
    }

    public virtual T GetById(int id)
    {
        return DbSet.Find(id);
    }

    public virtual void Add(T entity)
    {
        DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
        if (dbEntityEntry.State != EntityState.Detached)
        {
            dbEntityEntry.State = EntityState.Added;
        }
        else
        {
            DbSet.Add(entity);
        }
    }

    public virtual void Update(T entity)
    {
        DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
        if (dbEntityEntry.State != EntityState.Detached)
        {
            DbSet.Attach(entity);
        }
        dbEntityEntry.State = EntityState.Modified;
    }

    public void Delete(T entity)
    {
        DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
        if (dbEntityEntry.State != EntityState.Deleted)
        {
            dbEntityEntry.State = EntityState.Deleted;
        }
        else
        {
            DbSet.Attach(entity);
            DbSet.Remove(entity);
        }
    }

    public void Delete(int id)
    {
        var entity = GetById(id);
        if (entity == null) return;

        Delete(entity);
    }
}

我的模特

   public class Church
    {
        public int Id { get; set; }
        public string ChurchName { get; set; }
        public virtual ICollection<User> Users { get; set; }

    }

设置我的控制器来调用我的服务

public class ChurchController : ApiController
{
    private readonly IChurchService _churchService;
    public ChurchController(IChurchService churchService)
    {

        _churchService = churchService;
    }

    public IEnumerable<Church> Get()
    {

        var result = _churchService.GetAll();

        return result;

    }
}

我以前从未使用过 Simple Injector,但 IoC 模式始终相同。因此,正如 Steven 所说,您应该在容器中注册 IChurchService,以便框架知道在需要时要注入的实例类型是什么。

private static void InitializeContainer(Container container)
{
    // For instance:
    container.Register(typeof(IRepository<>), typeof(EFRepository<>));
    //Adding this should resolve it
    container.Register(typeof(IChurchService), typeof(ChurchService));
}

如果 ChurchService 有任何依赖项,请确保也注册它们。注册完成对象图所需的所有依赖项