依赖注入在网络 api 调用中不起作用

Dependency injection not working in web api call

您好,我正在尝试使用 WebAPI 构建 angular 2 Web 应用程序,Entityframework 使用依赖注入松散耦合。我正在使用 unity 进行依赖注入。我在一个解决方案中创建了多个项目来解决分离问题。

我已经在 unity.config 中配置了依赖关系,但是当我执行 webapi 应用程序并键入以下 url http://localhost:8702/api/allcustomers 时,我收到消息说客户控制器没有参数- 较少的构造函数。我在 unity.config 中设置了我的断点,它永远不会被击中

我也想知道我的实现是否正确

下面是我的解决方案的结构

CustomerOrder.Business.Objects CustomerOrder.Data.Objects(引用业务对象) CustomerOrder.Service.Api(引用业务对象和服务实现) CustomerOrder.Service.Implementation(引用业务对象和数据对象) CustomerOrder.Web(尚未实施)

下面是代码

CustomerOrder.Business.Objects

 public class Customer
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Gender { get; set; }
        public string Email { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string State { get; set; }

        public int? Zip { get; set; }

    }

CustomerOrder.Data.Objects

    public class CustomerDao : ICustomerDao
        {

            IEnumerable<CustomerOrder.BusinessObjects.Customer> ICustomerDao.GetAllCustomers()
            {
                using (var customerOrderContext = new Entities())
                {
                    return (from customer in customerOrderContext.Customers

                            select new CustomerOrder.BusinessObjects.Customer
                            {
                                Id = customer.Id,
                                FirstName = customer.FirstName,
                                LastName = customer.LastName,
                                Address = customer.Address,
                                City = customer.City,
                                Email = customer.Email,
                                Gender = customer.Gender,
                                State = customer.State,
                                Zip = customer.Zip
                            }).ToList();
                }
            }
      }


    public interface ICustomerDao
        {

            /// <summary>
            /// Get All Customers
            /// </summary>
            /// <returns></returns>
            IEnumerable<Customer> GetAllCustomers();

        }

        public interface IDaoFactory
        {
            ICustomerDao CustomerDao { get; }

        }
    }

  public class DaoFactory : IDaoFactory
    {
        public DaoFactory(ICustomerDao CustomerDao, IProductDao ProductDao, IOrderDao OrderDao)
        {
            this.CustomerDao = CustomerDao;
        }

        public ICustomerDao CustomerDao { set; get; }





    }

CustomerOrder.Service.Api

Unity.Config 

    public static void RegisterComponents()
            {
                var container = new UnityContainer();

                // register all your components with the container here
                // it is NOT necessary to register your controllers

                // e.g. container.RegisterType<ITestService, TestService>();

                container.RegisterType<ICustomerProvider, CustomerProvider>();
                container.RegisterType<IOrderProvider, OrderProvider>();
                container.RegisterType<IProductProvider, ProductProvider>();

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

CustomerController.cs

    public class CustomerController : ApiController
        {
            private ICustomerProvider customerProvider;


            public CustomerController(ICustomerProvider customerProvider)
            {
                this.customerProvider = customerProvider;
            }

            [Route("api/allcustomers")]
            public IEnumerable<Customer> GetAllCustomers()
            {
                return customerProvider.GetAllCustomers();
            }

CustomerOrder.Service.Implementation

public interface ICustomerProvider
{

    IEnumerable<BusinessObjects.Customer> GetAllCustomers();

}

 public class CustomerProvider : ICustomerProvider
    {

        private readonly IDaoFactory dataAccess;

        public CustomerProvider(IDaoFactory dalFactory)
        {
            this.dataAccess = dalFactory;
        }

        public IEnumerable<BusinessObjects.Customer> GetAllCustomers()
        {
            IList<BusinessObjects.Customer> customerCollection = new List<BusinessObjects.Customer>();
            dataAccess.CustomerDao.GetAllCustomers();
            return customerCollection;
        }
}

上下文Class

namespace CustomerOrderData.EF
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;

    public partial class Entities : DbContext
    {
        public Entities()
            : base("name=Entities")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
         //   throw new UnintentionalCodeFirstException();
        }

        public virtual DbSet<Customer> Customers { get; set; }
        public virtual DbSet<OrderDetail> OrderDetails { get; set; }
        public virtual DbSet<Order> Orders { get; set; }
        public virtual DbSet<Product> Products { get; set; }
    }
}

CustomerProvider 中,IDaoFactory 可能没有得到解析,因为它没有注册。将此添加到 Unity.Config:

container.RegisterType<IDaoFactory , DaoFactory >();

请尝试将无参数构造函数包含到客户控制器中。

public CustomerController() {}

您不仅应该注册 IDaoFactory 及其构造函数依赖项

container.RegisterType<IDaoFactory, DaoFactory>();
container.RegisterType<ICustomerDao, CustomerDao>();
container.RegisterType<IOrderDao, OrderDao>();
container.RegisterType<IProductDao, ProductDao>();