2014-07-14 30 views
23

Unity Thuộc Tôi đã tải mẫu này trong đó tôi có thể thử các tính năng của nhà cung cấp nhận dạng trong ASP.NET MVC 5:Nhà cung cấp danh và tiêm

http://www.nuget.org/packages/Microsoft.AspNet.Identity.Samples

Tôi đã sử dụng nhiều lần Unity DI cho kho của tôi , dịch vụ, đơn vị công việc và các nội dung khác không có sự cố.

Nhưng bây giờ, khi tôi cài đặt Unity DI, tôi gặp nhiều vấn đề với Giao diện và DI sử dụng Nhà cung cấp danh tính.

Tôi vừa tải xuống mã ví dụ và tôi đã định cấu hình Unity DI, nhưng tôi không muốn sử dụng Unity cho Identity Membership, tôi muốn sử dụng Unity DI chỉ dành cho tôi (IRepository, IService, IUnitOfWork, vv)

tôi có lỗi này khi tôi cố gắng đăng ký một user:

Các loại hiện nay, Microsoft.AspNet.Identity.IUserStore`1 [Ecoavantis.Interactive.GCI.Models. ApplicationUser], là một giao diện và không thể được xây dựng. Bạn có thiếu kiểu ánh xạ không?

Tôi đọc một số bài trong đó họ nói rằng tôi phải bao gồm một cái gì đó như thế này, nhưng tôi không cần phải tiêm phụ thuộc vào nhà cung cấp nhận dạng ...

container.RegisterType<UserManager<ApplicationUser>>(new HierarchicalLifetimeManager()); 
      container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new HierarchicalLifetimeManager()); 

bất cứ ai có thể giúp tôi xin vui lòng?

Mã số Ví dụ:

/// <summary>Registers the type mappings with the Unity container.</summary> 
     /// <param name="container">The unity container to configure.</param> 
     /// <remarks>There is no need to register concrete types such as controllers or API controllers (unless you want to 
     /// change the defaults), as Unity allows resolving a concrete type even if it was not previously registered.</remarks> 
     public static void RegisterTypes(IUnityContainer container) 
     { 
      // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements. 
      // container.LoadConfiguration(); 
      // TODO: Register your types here 


      //container.RegisterType<DbContext, ApplicationDbContext>(new ContainerControlledLifetimeManager()); 
      container.RegisterType<IUnitOfWorkAsync, UnitOfWork>(new PerRequestLifetimeManager()); 
      container.RegisterType<IMainPanelService, MainPanelService>(); 
      container.RegisterType(typeof (IRepositoryAsync<>), typeof (Repository<>)); 
      container.RegisterType<IDataContextAsync, ecoavantisinteractivegciContext>(new PerRequestLifetimeManager()); 
     } 
+0

Lớp ApplicationUser của bạn trông như thế nào? Người ta nói rằng nó đang được sử dụng như một lớp khi nó là một giao diện. Nếu bạn đang sử dụng giao diện cho người dùng ứng dụng, bạn đã thử định cấu hình DI cho giao diện đó và thực hiện nó chưa? – grimurd

+0

Có, tôi đã thử, nhưng nó không hoạt động ... Tôi có một số câu hỏi tương tự: http://stackoverflow.com/questions/24731426/register-iauthenticationmanager-with-unity – chemitaxis

Trả lời

38

Ok, tôi đã giải quyết vấn đề của tôi, tôi đã tiêm phụ thuộc với phương pháp này, nhưng tôi không hiểu rất rõ lý do tại sao nó làm việc ...

Hiện tại, Danh tính hoạt động tốt với Unity DI của tôi

container.RegisterType<AccountController>(new InjectionConstructor()); 
container.RegisterType<RolesAdminController>(new InjectionConstructor()); 
container.RegisterType<ManageController>(new InjectionConstructor()); 
container.RegisterType<UsersAdminController>(new InjectionConstructor()); 
+2

(Bit muộn cho bữa tiệc). Các chỉ thị lực lượng thống nhất để sử dụng tham số ít constructor (đối tượng InjectionConstructor rỗng) khi tạo AccountController. Nếu không, Unity sẽ cố gắng giải quyết hàm tạo 'được chỉ định nhất' (và sẽ thất bại). – Dribbel

+2

Hoặc đặt thuộc tính [InjectionConstructor] trên hàm tạo trống trong AccountController. –

9

Cảm ơn chemitaxis! Vì tôi không đủ đại diện để bình luận, tôi đăng một câu trả lời mới. Tôi giả định chemitaxis tạo ra 3 điều khiển cuối cùng của riêng mình vì đơn giản là đăng ký AccountController đầu tiên dường như đã làm việc cho tôi, mặc dù tôi mở rộng các tính chất User mô hình:

container.RegisterType<AccountController>(new InjectionConstructor()); 
13

Trong trường hợp của tôi, tôi thêm vào phần sau đây để UnityConfig .cs trong phương thức RegisterComponents.

container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(); 
0

Cập nhật cho câu trả lời chemitaxis và hvaughan3. Vì bạn nói điều đó xảy ra khi bạn cố gắng đăng ký một người dùng, nó có thể là trong tiêu chuẩn AccountController. Vấn đề ban đầu cho điều này là Unity cố gắng gọi các nhà xây dựng với hai tham số, ví dụ:

public AccountController(
    ApplicationUserManager userManager, 
    ApplicationSignInManager signInManager) 
{ 
    UserManager = userManager; 
    SignInManager = signInManager; 
} 

các dòng sau sẽ cho Unity để gọi constructor parameterless thay vào đó và sẽ không cần bất cứ điều gì khác.

container.RegisterType<AccountController>(new InjectionConstructor()); 

Tôi hy vọng lời giải thích này sẽ hữu ích.

Các vấn đề liên quan