3

C#, .NET Framework 4.5.1, Entity Framework 6.1.1 및 최신 ASP.NET MVC 5 웹 API 응용 프로그램을 개발하고 있습니다. Ninject의 버전 (Ninject.MVC5도 설치했습니다).InRequestScope()를 사용하는 경우 DBContext.SaveChanges()를 호출합니다.

종속성 주입을 구현하는 방법을 배우고 있습니다. 배운 것 같지만 질문이 있습니다. 이것들은 제 인터페이스와 클래스입니다. 작업 인터페이스의

단위 :

public interface IUnitOfWork 
{ 
    void Commit(); 
} 

사용자 정의 DbContext 구현 (나는 DI 수 있도록 IUnitOfWork 인터페이스를 사용) :

public class EFDbContext : DbContext, IUnitOfWork 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     [ ... ] 
    } 

    public void Commit() 
    { 
     this.SaveChanges(); 
    } 
} 

는 그리고 이것은 Ninject에와 Ninject.Web와 의존성 삽입을 허용하는 방법이다. 공유지.

나는 바인딩을 추가하는 클래스, NinjectConfigurator 가지고 :

public class NinjectConfigurator 
{ 
    public void Configure(IKernel container) 
    { 
     // Add all bindings/dependencies 
     AddBindings(container); 

     // Use the container and our NinjectDependencyResolver as 
     // application's resolver 
     var resolver = new NinjectDependencyResolver(container); 
     GlobalConfiguration.Configuration.DependencyResolver = resolver; 
    } 

    private void AddBindings(IKernel container) 
    { 
     ConfigureLog4net(container); 

     container.Bind<IUnitOfWork>().To<EFDbContext>().InRequestScope(); 
     container.Bind<IGenericRepository<User>>().To<GenericRepository<User>>(); 
    } 

    private void ConfigureLog4net(IKernel container) 
    { 
     log4net.Config.XmlConfigurator.Configure(); 
     var loggerForWebSite = LogManager.GetLogger("MattSocialNetworkWebApi"); 
     container.Bind<ILog>().ToConstant(loggerForWebSite); 
    } 
} 

을 그리고 마지막으로, 나는 NinjectWebCommon에 있습니다

/// <summary> 
/// Load your modules or register your services here! 
/// </summary> 
/// <param name="kernel">The kernel.</param> 
private static void RegisterServices(IKernel kernel) 
{ 
    var containerConfigurator = new NinjectConfigurator(); 
    containerConfigurator.Configure(kernel); 
} 

내가 .InRequestScope()을 사용하여 I 요청 당 EFDbContext 인스턴스를 원하기 때문에.

내 질문은 : 언제해야합니까? EFDbContext.SaveChanges()? 요청 당 하나의 인스턴스를 사용하고 있다면 요청이 끝날 때 변경 사항을 저장해야한다고 생각합니까?

어디서 EFDbContext.Commit()을 넣어야합니까?

+0

질문에 대한 답변은 [이 Stackoverflow 답변] (https://stackoverflow.com/a/10588594/264697) 안에 묻혀 있습니다. – Steven

답변

2

내가 수행하는 방식과 다른 곳에서 수행 한 방식은 각 트랜잭션 후에 비즈니스 계층에서 또는 컨트롤러에서 커밋하는 것입니다. 즉, SaveChanges()가 요청 당 두 번 이상 호출되는 경우가 있지만 중요한 문제는 아닙니다.

나는 SocialGoal 코드를보고 많은 것을 배웠다.이 코드는 here이다. 그것은 DI를 위해 Autofac을 사용하지만, 그것은 당신 자신의 코드와 같은 원리입니다. 어쩌면 당신은 영감을 얻을 수 있고 거기도 대답 할 수 있습니다.

관련 문제