8

Không ai trong số các nhà thầu tìm thấy với 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' vào loại 'LMS.Services.Security.EncryptionService 'có thể được gọi với các dịch vụ có sẵn và các thông số: không thể giải quyết thông số 'LMS.Models.SecuritySettings securitySettings' của constructor '.ctor Void (LMS.Models.SecuritySettings)'Autofac Không ai trong số các nhà thầu tìm thấy với 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'

Dưới đây là các tập tin mã

Loại dịch vụ

public class EncryptionService : IEncryptionService 
{ 
    private readonly SecuritySettings _securitySettings; 
    public EncryptionService(SecuritySettings securitySettings) 
    { 
     this._securitySettings = securitySettings; 
    } 
} 

Bootstrapper

private static void SetAutofacContainer() 
{ 
    var builder = new ContainerBuilder(); 
    builder.RegisterControllers(Assembly.GetExecutingAssembly()); 
    builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerRequest(); 
    builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>().InstancePerRequest(); 

    builder.RegisterAssemblyTypes(typeof(CourseRepository).Assembly) 
      .Where(t => t.Name.EndsWith("Repository")) 
      .AsImplementedInterfaces() 
      .InstancePerRequest(); 

    builder.RegisterAssemblyTypes(typeof(CourseService).Assembly) 
      .Where(t => t.Name.EndsWith("Service")) 
      .AsImplementedInterfaces() 
      .InstancePerRequest(); 

    builder.RegisterFilterProvider(); 
    var container = builder.Build(); 
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
} 

Nó được làm việc trước đó. Nhưng khi tôi giới thiệu triển khai EncryptionService, tôi nhận được lỗi trên. Đây là làm việc thực hiện các mã khác như sau

public class CourseService : ICourseService 
{ 
    #region Fields 

    private readonly IRepository<Course> _courseRepository; 
    private readonly IUnitOfWork _unitOfWork; 

    #endregion 

    #region ctor 

    public CourseService(IRepository<Course> courseRepository, IUnitOfWork unitOfWork) 
    { 
     _courseRepository = courseRepository; 
     _unitOfWork = unitOfWork; 
    } 
    #endregion 
} 

Trả lời

8

Khi Autofac cố gắng giải quyết EncryptionService nó cố gắng để giải quyết một vụ SecuritySettings nhưng Autofac là không nhận thức được một đăng ký đó.

Để giải quyết lỗi này, bạn nên đăng ký triển khai SecuritySettings.

Ví dụ:

builder.RegisterType<SecuritySettings>() 
     .As<SecuritySettings>(); 
+0

Cảm ơn rất nhiều Cyril Durand. Nó hiện đang hoạt động. – pbhalchandra

0

Bạn cũng có thể điều chỉnh hành vi Autofac để làm việc như bạn dự đoán ban đầu [và phù hợp với giá trị mặc định của một số container khác] bằng cách thêm AnyConcreteTypeNotAlreadyRegisteredSource (xem the docs for Sources): -

var builder = new ContainerBuilder(); 
builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource()); 

Tôi đã sử dụng lược đồ này cùng với delegate factoriesimplicit Relationship Types để xóa khá nhiều đăng ký rõ ràng khỏi bộ ứng dụng nhưng dường như bạn đã đi xuống con đường rõ ràng (boilerpla ty: P) đăng ký tôi muốn khuyên bạn nên googling AnyConcreteTypeNotAlreadyRegisteredSource để xem liệu một chương trình rộng lớn hơn có thể phù hợp với những gì bạn đang tìm kiếm tốt hơn.

0

trong trường hợp của tôi, tôi chưa đăng ký ngữ cảnh. Tôi đã đăng ký ngữ cảnh và nó hoạt động cho tôi

builder.RegisterType<JComDbEntities>().AsSelf().As<DbContext>().InstancePerLifetimeScope(); 
Các vấn đề liên quan