タイプ '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
}
AutofacがEncryptionService
を解決しようとすると、SecuritySettings
サービスを解決しようとしますが、Autofacはそのような登録を認識しません。
このエラーを解決するには、SecuritySettings
実装を登録する必要があります。
例えば :
builder.RegisterType<SecuritySettings>()
.As<SecuritySettings>();
私の場合、コンテキストを登録していません。コンテキストを登録し、それは私のために働いた
builder.RegisterType<JComDbEntities>().AsSelf().As<DbContext>().InstancePerLifetimeScope();
AnyConcreteTypeNotAlreadyRegisteredSource
を追加することで、Autofacの振る舞いを調整して、当初予想したとおりに動作する[および他のいくつかのコンテナのデフォルトに合わせる]こともできます( Sourcesのドキュメント を参照):-
var builder = new ContainerBuilder();
builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());
このスキームを デリゲートファクトリー および 暗黙のリレーションシップタイプ と共に使用して、アプリのスイートから明示的な登録をほぼ削除しましたが、明示的な道を進んでいるようです(boilerplaty:P)登録グーグルでAnyConcreteTypeNotAlreadyRegisteredSource
をグーグルで検索することをお勧めします。