2011-09-15 32 views
4

共享連接這是我的Global.asax當前實現StructureMap的:使用PetaPoco與StructureMap

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

下面是refered到上面的代碼:

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(); 

我該尋找一個instace,如果有那麼它使用它,如果不是它創造了另一個。

雖然我可能是錯誤的,但我無法完全記住。

+0

我不使用T4遺憾 – Jon

+0

哦,對了,你是用手寫出所有的poco嗎? –

+0

是的,因爲我有數據庫有令人討厭的大寫字母和下劃線到處都是列名,所以我創建了POCO並使用列名裝飾屬性以保持代碼清潔 – Jon

3

我只能說Autofac,因爲這是我在我的項目中使用的。這可能不適用於你想要做的事情,但我可能會分享它。爲了讓每個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()傳遞哪些參數來告訴它調用哪個版本的構造函數。當構造你的對象時,它會找到具有匹配參數的構造函數。

每次構造函數有它的依賴注入,它使用整個HTTP請求的同一petapoco數據庫對象,因爲這是我告訴Autofac做(InstancePerHttpRequest)

我控制器構造函數採用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

另外,我可能會丟失一些東西,但是如果你有一個回收,例如取回人,它會再次關閉它,因爲它一次執行sql。如果您的網絡應用有5個請求,那麼它會使用已經創建的對象? – Jon