3

Entity Framework 구성 클래스에 종속성을 주입하려고하는데 작동하지 않는 것 같습니다. 구성 클래스는 this-엔티티 프레임 워크 "마이그레이션 구성"및 autofac

public class Configuration : DbMigrationsConfiguration<ApplicationContext> 
{ 
    private readonly IApplicationUserManager _applicationUserManager; 
    public Configuration(IApplicationUserManager userManager) 
    { 
     AutomaticMigrationsEnabled = true; 
     AutomaticMigrationDataLossAllowed = true; 
     _applicationUserManager = userManager; 
    } 
    protected override void Seed(ApplicationContext context) { 
     //seed data here 
    } 
} 

처럼 보이는 그리고 "업데이트 데이터베이스"를 실행하면 어떤 마이그레이션 구성 유형이 발견되지 않았다 "고 불평 때문에 작동하지 않습니다 this-

builder.Register(c => new Configuration(c.Resolve<ApplicationUserManager>())); 

처럼 Autofac에 등록하고 어셈블리에서 ". 그래서 분명히 매개 변수가없는 생성자를 좋아하지 않습니다. 그래서 다음과 같이 Autofac와 함께 this-

public class Configuration : DbMigrationsConfiguration<ApplicationContext> 
{ 
    public IApplicationUserManager ApplicationUserManager {get;set;} 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = true; 
     AutomaticMigrationDataLossAllowed = true; 

    } 
    protected override void Seed(ApplicationContext context) { 
     //seed data here 
    } 
} 

같은 속성 주입을 사용하여 등록 시도 -

builder.Register(c => new Configuration { ApplicationUserManager = c.Resolve<ApplicationUserManager>() }); 

그러나,이 중 하나가 작동하지 않습니다는 ApplicationUserManager 속성은 항상 null입니다. Configuration 클래스에 속성을 주입 할 수 있습니까?

+0

왜 구성에 IApplicationUserManager가 필요한지 궁금하십니까? 일반적으로이 파일을 깨끗하게 유지하고 구성 파일이있는 UpdateDatabase를 실행 하시겠습니까? – Spock

+1

@ Spock은 조금 이상하지만, 역할 등으로 복잡한 사용자 계정을 시드한다는 것을 알고 있습니다.내가 rolemanager와 usermanager 추상화를 사용할 수있을 때 훨씬 쉽게 만들어졌다. 그들은 컨텍스트에 직접 액세스 할 수 있기 때문에 완전히 필요하지 않습니다. – thebringking

답변

3

우선, 마이그레이션 구성 클래스에서 일부 종속성을 사용하려는 것이 이상하게 보입니다. 그래서 나는 일반적으로 aproach에 대해 생각해 보라고 조언한다.

설명 :

귀하의 구성이 올바른지,하지만 당신은 의존성 주입을 사용할 때 염두에 둘 것을 계속한다 :

  1. 당신이 의존성 컨테이너에 대한 의존성을 등록해야합니다.
  2. 종속성 컨테이너를 사용하여 종속성을 포함하는 구성 요소를 만들어야하므로이 컨테이너는 개체를 만드는 동안 모든 종속성을 주입합니다.

그래서 종속성을 등록했지만 구성 클래스의 인스턴스가 종속성 컨테이너를 통해 생성되지 않는 것이 문제입니다. 예를 들어 종속성 컨테이너를 통해 인스턴스를 생성하는 경우.

DependencyResolver.Current.GetService<Configuration>(); 

주사가 작동합니다. 귀하의 상황에서는 구성이 EF에 의해 작성되기 때문에 허용되지 않습니다.

가능한 해결책 : 구성 클래스에서 수동으로 인스턴스를 확인할 수 있습니다.

public class Configuration : DbMigrationsConfiguration<ApplicationContext> 
{ 
    public Configuration(IApplicationUserManager userManager) 
    { 
     AutomaticMigrationsEnabled = true; 
     AutomaticMigrationDataLossAllowed = true; 
    } 
    protected override void Seed(ApplicationContext context) { 
     var applicationUserManager = DependencyResolver.Current.GetService<IApplicationUserManager>(); 
    } 
} 

결론 : 먼저 aproach에 대해 생각하고 당신이 정말이 사용을 제안 된 해결 방법을 수행해야합니다.

+0

감사합니다. 이것에 대해 살펴 보겠습니다. Spock에 대한 제 의견에서 언급했듯이, 데이터베이스 마이그레이션 클래스에서 UserManager 및 RoleManager 추상화를 실제로 사용할 필요는 없지만 복잡한 객체를 수동으로 시드하는 것보다 좋을 것입니다. – thebringking

+0

나는이 길로 갔기 때문에 이것을 답으로 표시하고있다. 방금 직접 컨텍스트를 사용했습니다. – thebringking

0

필자는 종속성 삽입을 사용하지 않고 구성 클래스에서 개체를 만들지 않고도 사용자/역할/클레임 클래스를 사용할 수 있다고 생각합니다. 이것은 나를 위해, 정체성 프레임 워크와 함께 작동합니다.

UserClaimService userClaimService = new UserClaimService(new EfRepository<UserClaim>(context)); 
    UserRoleService userRoleService = new UserRoleService(new EfRepository<UserRole>(context)); 
    UserLoginService userLoginService = new UserLoginService(new EfRepository<UserLogin>(context)); 
    RoleService roleService = new RoleService(new EfRepository<Role>(context)); 

    ApplicationUserService applicationUserService = new ApplicationUserService(
      new EfRepository<ApplicationUser>(context), 
      userRoleService, 
      roleService); 

    UserManager<ApplicationUser, int> userManager = new UserManager<ApplicationUser, int>(new UserStore(applicationUserService, userClaimService, userRoleService, userLoginService, roleService)); 
관련 문제