2012-01-08 2 views
0

ASP.NET 응용 프로그램에서 엔티티 프레임 워크와 함께 WCF 기능을 사용하고 있습니다. 목표는 예를 참조 IoC 컨테이너에 dbcontext을 유지하는 것입니다 :Castle Windsor LifeStyle for WCF?

1)의 Global.asax를

protected void Application_Start(object sender, EventArgs e) 
    { 
     Container = new WindsorContainer(); 
     Container.AddFacility<WcfFacility>(); 
     Container.Register(
      Component.For<IDBContext>().ImplementedBy<DBContext>().LifeStyle.PerWcfOperation() 
      ); 
    } 

2) CustomerService.cs 공용 클래스를 CustomerService : ICustomerService { 개인 읽기 전용 ICustomerBl customerBl;

public CustomerService(ICustomerBl customerBl) 
    { 
     this.customerBl = customerBl; 
    } 

    public Customer GetById(int Id) 
    { 
     Customer customer = customerBl.GetById(5); 
     return customer; 
    } 
} 

3) CustomerBl.cs

public class CustomerBl : ICustomerBl 
{ 
    private ICustomerRepository _repository; 
    public CustomerBl(ICustomerRepository customerRepository) 
    { 
     _repository = customerRepository; 
    } 

    public Customer GetById(int Id) 
    { 
     return _repository.GetById(5); 
    } 
} 

4) CustomerRepository.cs

public class CustomerRepository: ICustomerRepository 
{ 
    public IDBContext _dbContext; 

    public CustomerRepository(IDBContext dbContext) 
    { 
     _dbContext = dbContext; 
    } 

    public Customer GetById(int Id) 
    { 
     _dbContext.ContextCounter = 1; 
     return new Customer 
     { 
      Id = 5, 
      FirstName = "Joe", 
      LastName = "Blogg", 
      Age = 45 
     }; 
    } 
} 

5) TestServiceClient

protected void Button1_Click(object sender, EventArgs e) 
    { 
     ServiceReference1.CustomerServiceClient customer = new ServiceReference1.CustomerServiceClient(); 

     customer.GetById(5); 

    } 

나는 다음과 같은 일을 해요 :

1) CustomerGetById()에서 호출 WCF 방법, dbcontext 여기 인스턴스화 _dbContext.ContextCounter = 0

2)를 다시 호출하고 dbContext 인스턴스화 한 - _dbContext.ContextCounter = 1 목표는 것입니다

을 각각의 단일 wcf 메소드 호출 이후에 dbContext의 새 인스턴스. 어떻게이 작업을 수행 할 수 있습니까?

감사합니다.

+0

다음과 같이 바꿀 수 있습니까? * 문제는 wcf 메소드 호출 이후입니다. inst DBContext의 ance가 저장됩니다. 각 단일 wcf 메서드 호출 후 DBContext 새 인스턴스 싶습니다. 이걸 어떻게 성취 할 수 있니? * 당신이 무엇을 요구하고 있으며 어떤 행동을하고 있는지 분명하지 않다. –

+0

나는 이전 의견에 동의한다. 나는 당신의 질문을 읽는 길에서, 당신이 원하는 것을하고 있어야합니다. PerWcfOperation은 IDBContext 인스턴스의 범위가 현재 WCF 요청/메소드에 적용됨을 의미합니다. – Sneal

+0

예를 들면 다음과 같습니다. 1) wcf 메소드 CustomerGetById()를 호출합니다. dbcontext가 인스턴스화됩니다. 2) wcf 메소드 ProductGetById()를 호출합니다. 이전과 동일한 dbcontext 인스턴스를 갖게되었습니다. 목표는 새로운 목표입니다. 감사합니다. – mirt

답변

0

다음 코드는 WindsorContainer에서 PerWebRequest 라이프 스타일로 구성 요소를 등록합니다. 당신의 Web.config에 다음을 추가해야 PerWebRequest로

public void Register(Component component) 
    { 
     WindsorContainer container = new WindsorContainer(); 
     IKernel kernel = container.Kernel; 
     kernel.AddComponent(component.Name, component.Service, component.Impl,LifestyleType.PerWebRequest);         
    } 

는 라이프 스타일을 만들려면

<system.web> 
    <httpModules> 
    <add name="PerRequestLifestyle" type="Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule, Castle.MicroKernel" /> 
    </httpModules> 
</system.web> 

<system.webServer> 
<modules> 
    <add name="PerRequestLifestyle" type="Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule, Castle.MicroKernel" /> 
</modules> 
</system.webServer> 
+0

다음을 사용하려고했습니다 : Component.For (). 구현 된 () .LifeStyle.PerWebRequest하지만 작동하지 않습니다. – mirt

0

시도 :

Container.Register(
     Component.For<IDBContext>().ImplementedBy<DBContext>().LifeStyleTransient().AsWcfService() 
     ); 

나를위한 작품,하지만 난 내가 말할 방법을 알아낼 질수 Windsor가 서비스에서 정의한 서비스를 사용합니다.

관련 문제