StructureMap 및 IDbConnection에서 "요청 별"접근 방식 사용 - 연결은 열리지 만 실행되면 닫힙니다.

dapper structuremap

문제

"요청 당"유형의 시나리오를 활용하기 위해 StructureMap으로 Dapper를 설정하려고합니다. 내 Global.asax BuildUp() 구조체 BuildUp() 에서 BuildUp() 메서드를 논의한 찾은 하나, NHibernate 관련된 Ayende의 이전 게시물에서 수정 된 다음 있습니다.

protected static IDbConnection CreateConnection() { 
    var settings = ConfigurationManager.ConnectionStrings["MyConnectionString"];
    var connection = DbProviderFactories.GetFactory(settings.ProviderName).CreateConnection();
    if (connection == null) { 
        throw new ArgumentNullException("connection");
    }
    connection.ConnectionString = settings.ConnectionString;
    return connection;
}

public static IDbConnection CurrentConnection { 
    get { return (IDbConnection)HttpContext.Current.Items["current.connection"]; }
    set { HttpContext.Current.Items["current.connection"] = value; }
}

public Global() { 
    BeginRequest += (sender, args) => { 
        CurrentConnection = CreateConnection();
        CurrentConnection.Open(); 
    };

    EndRequest += (sender, args) => { 
        if (CurrentConnection == null) return;
        CurrentConnection.Close();
        CurrentConnection.Dispose();
    }
}

void Application_Start(object sender, EventArgs e) { 
    ObjectFactory.Initialize(x => { 
        x.For<IDbConnection>().Singleton().Use(CreateConnection());
        x.For<ICustomerRepository>().Use<CustomerRepository>();
        x.SetAllProperties(y => y.OfType<ICustomerRepository>());
    });
}

// BasePage.cs
public class BasePage : System.Web.UI.Page { 
    public IDbConnection CurrentConnection { get; set; }

    public BasePage() { 
        ObjectFactory.BuildUp(this);
    }
}

이 호출하려고 할 때마다 BeginRequest 핸들러의 중단 점에 연결에서 Open ()이 호출되었음을 나타내지 만 실제 쿼리는 Connection의 현재 상태가 닫혔다는 오류와 함께 실패합니다.

수동으로 각 저장소 메서드 내에서 IDbConnection에 대한 열기 및 닫기를 호출하면 작동하는 것처럼 보일 수 있지만 가능한 경우이를 수행하지 않아야합니다.

수락 된 답변

연결을 싱글 톤으로 만들고 있습니다. 즉, 응용 프로그램 페이지 전체에 하나의 연결 개체 만 사용됩니다. Application_Start 핸들러에서 새로 시작한 연결은 페이지에서 사용되지 않습니다. 컨테이너에서 연결을 가져올 것이기 때문입니다.

다음과 같은 것을 사용하는 것이 더 낫습니다.

void Application_Start(object sender, EventArgs e) { 
    ObjectFactory.Initialize(x => { 
        x.For<IDbConnection>().HttpContextScoped().Use(() => CreateConnection());
        ...
    }
}

 public Global() { 
    EndRequest += (sender, args) => { 
        ObjectFactory.GetInstance<IDbConnection>.Dispose();
    }
 }



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.