web-dev-qa-db-ja.com

Autofac 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'で見つかったコンストラクターはありません

タイプ 'LMS.Services.Security.EncryptionService'の 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'で見つかったコンストラクターは、利用可能なサービスおよびパラメーターで呼び出すことができません:パラメーター 'LMS.Models.SecuritySettings securitySettings'を解決できませんコンストラクター 'Void .ctor(LMS.Models.SecuritySettings)'

コードファイルは次のとおりです

サービスクラス

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

ブートストラップ

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));
}

それは以前に働いていました。しかし、EncryptionService実装を導入すると、上記のエラーが発生します。以下は、他の作業コードの実装です。

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
}
15
pbhalchandra

AutofacEncryptionServiceを解決しようとすると、SecuritySettingsサービスを解決しようとしますが、Autofacはそのような登録を認識しません。

このエラーを解決するには、SecuritySettings実装を登録する必要があります。

例えば ​​:

builder.RegisterType<SecuritySettings>()
       .As<SecuritySettings>(); 
16
Cyril Durand

私の場合、コンテキストを登録していません。コンテキストを登録し、それは私のために働いた

builder.RegisterType<JComDbEntities>().AsSelf().As<DbContext>().InstancePerLifetimeScope();
2
Pranav Mishra

AnyConcreteTypeNotAlreadyRegisteredSourceを追加することで、Autofacの振る舞いを調整して、当初予想したとおりに動作する[および他のいくつかのコンテナのデフォルトに合わせる]こともできます( Sourcesのドキュメント を参照):-

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

このスキームを デリゲートファクトリー および 暗黙のリレーションシップタイプ と共に使用して、アプリのスイートから明示的な登録をほぼ削除しましたが、明示的な道を進んでいるようです(boilerplaty:P)登録グーグルでAnyConcreteTypeNotAlreadyRegisteredSourceをグーグルで検索することをお勧めします。

2
Ruben Bartelink