2011-09-15 5 views
4

とPetaPocoの共有接続を使用する:これは、Global.asaxの中のStructureMapの私の現在の実装であるのStructureMap

以下
var container = (IContainer)IOCContainer.Initialize(); 
DependencyResolver.SetResolver(new StructureMapDependencyResolver(container)); 

は、上記に参照されているコードです:

public static class IOCContainer 
    { 
     public static IContainer Initialize() 
     { 
      ObjectFactory.Initialize(x => 
      { 
       x.Scan(scan => 
       { 
        scan.TheCallingAssembly(); 
        scan.WithDefaultConventions(); 
        scan.AddAllTypesOf<IController>(); 
       }); 

       x.For<IConfigRepository>().Use<ConfigRepository>(); 
      }); 
      return ObjectFactory.Container; 
     } 

    } 

public class StructureMapDependencyResolver : IDependencyResolver 
    { 
     public StructureMapDependencyResolver(IContainer container) 
     { 
      _container = container; 
     } 

     public object GetService(Type serviceType) 
     { 
      if (serviceType.IsAbstract || serviceType.IsInterface) 
      { 
       return _container.TryGetInstance(serviceType); 
      } 
      else 
      { 
       return _container.GetInstance(serviceType); 
      } 
     } 

     public IEnumerable<object> GetServices(Type serviceType) 
     { 
      return _container.GetAllInstances<object>() 
       .Where(s => s.GetType() == serviceType); 
     } 

     private readonly IContainer _container; 
    } 

私が使用していることを読んだことがあります共有接続がパフォーマンスを少し向上させる可能性がありますので、私はMVCアプリケーションでこれを使用する方法を知りました。私は私のリポジトリのコンストラクタに新しく作成したPetaPoco.Databaseオブジェクトを渡さなければならないと思いますか?

おかげ

答えて

2

:あなたは、それがそこにカウンタをインクリメントし、オブジェクトを使用している場合に使用する接続は、すでに存在しているかどうかを確認するPetapoco機能と連携して

x.For<PetaPoco.Database>().Singleton().Use(() => new PetaPoco.Database("DBConnection")); 
0

、あなたが以下が利用可能でしょうPetaPocoで取得T4を実行します。..

{yourmodel}.ConnectionStringDB.GetInstance(); 

Iこれは1つが存在する場合、それがあればそれを使用して、instaceを探しますそれは別のものを作りません。

私はそれでも間違っている可能性があります。私は完全に覚えていません。

+0

私は残念なことにT4を使用していません – Jon

+0

ああ、あなたはあなたのすべてのポコを手で書いていますか? –

+0

私はデータベースとして厄介な大文字とアンダースコアを列名のために置くので、私はPOCOを作成していると、コードを清潔に保つために列名でプロパティを飾る – Jon

3

私は自分のプロジェクトで使っているのと同じように、私はオートファックの話しかできません。これはあなたがやろうとしていることには当てはまらないかもしれませんが、私はそれを分かち合うかもしれません。 httpリクエストあたりpetapocoデータベースオブジェクトを取得するには、私はglobal.asax.csでこの設定を持っている

builder.RegisterType<MyProject.ObjectRelationalMapper.PetaPoco.Database>() 
       .As<MyProject.ObjectRelationalMapper.PetaPoco.Database>() 
       .WithParameters(new List<NamedParameter>() {new NamedParameter("connectionStringName", "MyProjectConnectionString")}) 
       .InstancePerHttpRequest(); 

MyProject.ObjectRelationalMapper.PetaPocoはちょうど私のrenameapaced petapoco.csです。

Autofacでは、どのパラメータをWithParameters()経由で渡しているかを伝えることで、どのバージョンのコンストラクタを呼び出すかを知ることができます。あなたのオブジェクトを構築するとき、それは一致するパラメータでコンストラクタを見つけます。

コンストラクタはその依存関係は、それは私が(InstancePerHttpRequest)を行うためにAutofacに言ったことだから、それは、httpリクエストを通して同じpetapocoデータベースオブジェクトを使用して注入したたびに

私のコントローラのコンストラクタは、その中に依存関係としてINextMatchServiceを取ります今度は、依存関係としてINextMatchRepositoryを取ります

public NextMatchRepository(Database database, ISessionWrapper sessionWrapper) 
{ 
    this._database = database; 
    this._sessionWrapper = sessionWrapper; 
} 

「データベース」タイプは、上記のコードで構成されMyProject.ObjectRelationalMapper.PetaPoco.Database、です。これで私のリポジトリは共有データベース接続で動作するようになりました。誰もが知りたい場合、私はこれで行きました

// Open a connection (can be nested) 
public void OpenSharedConnection() 
{ 
    if (_sharedConnectionDepth == 0) 
    { 
     _sharedConnection = _factory.CreateConnection(); 
     _sharedConnection.ConnectionString = _connectionString; 
     _sharedConnection.Open(); 

     if (KeepConnectionAlive) 
      _sharedConnectionDepth++;// Make sure you call Dispose 
    } 
    _sharedConnectionDepth++; 
} 
+0

ありがとう。私はちょうど別の問題を考えました。アプリケーションが共有接続を使用しているかどうかを確認するために単体テストをどのように行うのですか? – Jon

+0

また、私は何かが欠落している可能性がありますが、一度に1つのSQLを実行するため、たとえば人のフェッチを行うrepoがある場合は、再度閉じます。あなたのWebアプリケーションで5つのリクエストがある場合、その時点で既に作成されたオブジェクトが使用されますか? – Jon

関連する問題