次のエラーがあります。
ExceptionMessage =タイプ 'RestAPI.DevelopersController'の 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'で見つかったコンストラクターのどれも、利用可能なサービスとパラメーターで呼び出すことができます:コンストラクター 'Voidのパラメーター' Services.DevelopersService userService 'を解決できません。 ctor(Services.DevelopersService) '。
Global.asax.cs
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
AutoMapperConfig.RegisterMappings();
var builder = new ContainerBuilder();
builder.RegisterModule(new ServiceModule());
builder.RegisterModule(new ORMModule());
builder.RegisterApiControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();
var container = builder.Build();
var resolver = new AutofacWebApiDependencyResolver(container);
GlobalConfiguration.Configuration.DependencyResolver = resolver;
}
ServiceModule.cs
public class ServiceModule : Autofac.Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterAssemblyTypes(Assembly.Load("Services"))
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
}
}
ORMModule.cs
public class ORMModule : Autofac.Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType(typeof(DatabaseContext)).As(typeof(DbContext)).InstancePerLifetimeScope();
}
}
DevelopersController
public class DevelopersController : ApiController
{
private DevelopersService _developersService;
public DevelopersController(DevelopersService userService)
{
_developersService = userService;
_developersService.SetIdentity(HttpContext.Current.Request.LogonUserIdentity.Name.ToString().Substring(4));
}
DevelopersService.cs
public class DevelopersService : IService<User>
{
private DatabaseContext _db;
public DevelopersService(DatabaseContext db)
{
_db = db;
}
public void SetIdentity(string username)
{
}
public User Create(User entity)
{
return new User();
}
public User Read(User Id)
{
return new User();
}
public void Update(User user)
{
}
public void Delete(User Id)
{
}
public IEnumerable<User> GetAll()
{
return _db.Users.AsEnumerable();
}
}
IService.cs
public interface IService<T> where T : BaseEntity
{
void SetIdentity(string identity);
T Create(T entity);
T Read(T Id);
void Update(T entity);
void Delete(T Id);
IEnumerable<T> GetAll();
}
どうすれば修正できますか?
このエラーメッセージはAutofacがDevelopersController
をインスタンス化しようとしたときに発生します。新しいDevelopersController
を作成するには、インスタンスDevelopersService
を提供する必要がありますが、どれもAutofacに登録されていません。
次のコードがあっても
builder.RegisterAssemblyTypes(Assembly.Load("Services"))
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
AutofacにDevelopersService
を登録します。これはDevelopersService
としては登録しませんが、実装されたインターフェイス(つまりIService<User>
)として登録します
問題を修正するために、サービスをそれ自体として登録するように登録を変更できます
builder.RegisterAssemblyTypes(Assembly.Load("Services"))
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces()
.AsSelf()
.InstancePerLifetimeScope();
またはDevelopersController
をDevelopersService
ではなくIService<USer>
に依存するように変更します
public class DevelopersController : ApiController
{
private IService<USer> _userService;
public DevelopersController(IService<USer> userService)
{
_userService= userService;
_userService.SetIdentity(HttpContext.Current.Request.LogonUserIdentity.Name.ToString().Substring(4));
}
このソリューションをお勧めします。
OK、私はnopcommerceを使用しており、依存関係レジストラにはタイプがあります
入力しました:
builder.RegisterType<CustomerReturnsService>().As<CustomerReturnsService>();
察するに
builder.RegisterType<CustomerReturnsService>().As<ICustomerReturnsService>();
最後の顧客返品サービスのI
に注意してください。サービスのインターフェースにリンクしています。
私の答えがまだ役に立てば幸いですが、問題はおそらく他のプロジェクトにあるDevelopersServiceクラスの参照がないことだと思います。以下のコードを試してください。
builder.RegisterAssemblyTypes(typeof(DevelopersService).Assembly)
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces().InstancePerRequest();