2012-01-08 28 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メソッド呼び出し後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 ().ImplementedBy ().LifeStyle.PerWebRequestが動作しません – mirt

0

試してみてください。

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

私の作品が、私は私が言う方法を見つけ出すカントウィンザーがサービスで定義したサービスを使用する

関連する問題