2016-11-01 1 views
0

Привет Я пытаюсь создать веб-приложение с угловым 2, используя WebAPI, Entityframework, который слабо связан с использованием инъекции зависимостей. Я использую единство для инъекций зависимости. Я создал несколько проектов в одном решении для решения проблем разделения.Зависимость впрыска не работает в веб-api call

Я настроил зависимость в файле unity.config, однако, когда я выполняю приложение webapi и набираю следующий url http://localhost:8702/api/allcustomers, я получаю сообщение о том, что у контроллера клиента нет конструктора без параметров. Я поставил свои точки разрыва в unity.config, которые никогда не получить удар

Я хотел бы понять, если моя реализация является правильной, а

Ниже представлена ​​структура моего решения

CustomerOrder.Business. Объекты 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; 
     } 
} 

Контекст Класс

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; } 
    } 
} 
+0

Ну вы еще не зарегистрированы контроллеров. Я не знаком с Unity, но, вероятно, есть одна строка, которую вы здесь не видите. – DavidG

+0

Где вы называете метод 'RegisterComponents()'? Кажется, он не называется –

+0

Его в единстве.config. Его там в сообщении – Tom

ответ

0

В CustomerProvider, то IDaoFactory, вероятно, не получают решен, потому что он не зарегистрирован. Добавьте к этому Unity.Config:

container.RegisterType<IDaoFactory , DaoFactory >(); 
+0

Нужно ли устанавливать единство в проекте ServiceImplementation, потому что там, где я пытаюсь ввести IDaoFactory. В настоящее время я установил единство в сети.apii project – Tom

+0

@Tom ... Все регистрации выполняются в корне (сборка контроллера) –

+0

Я зарегистрировал DaoFactory в файле unity.config, но это, похоже, еще не решило проблему. – Tom

0

Пожалуйста, попробуйте в том числе конструктор без параметров в контроллер клиента.

public CustomerController() {} 
+0

Тогда его инъекция не будет работать. –

+0

Вы правы. С беззаметным конструктором моя инъекция не работает – Tom

0

Вы должны зарегистрировать не только IDaoFactory и его зависимостей конструктора

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

Я уже это сделал. Я обновляю свой пост с помощью класса контекста. Первый подход, который я использовал, - это база данных. Не уверен, что мне нужно что-то делать в классе контекста. На данный момент нет ошибки, но нет данных – Tom

+0

Я также проверил журналы приложений в средстве просмотра событий. Не исключение. SQL Profiler делает запрос запроса к таблице клиентов. – Tom

+0

Во время отладки я вижу ошибку в классе customerdao в методе GetAllCustomers(). Объект customerorderContext.Customers выдает ссылку на объект, не установленную на экземпляр объекта. – Tom

Смежные вопросы