4

1)

public class DataProvider : IProvider , IDisposable{

       private SqlConnection connection = null;
       public DataProvider(string ConnectionString) {
            this.connection = new SqlConnection(ConnectionString);
           this.connection.Open();
       }

       public object GetUniqueData(SqlCommand CommandSql){}

       public void ExecuteInsertDeleteUpdate(SqlCommand CommandSql){}

       public void Dispose(){
          if (this.connection != null) {
              this.connection.Close();
              this.connection.Dispose();
          }
       }
}

2)

public class ManageBrandDAL : IManageBrandDAL {

      private IProvider provider = null;

      [Inject]
      public ManageBrandDAL (IProvider provider_){
           this.provider  = provider_;
      }

      public void RegisterBrand(string a_BrandName){
           SqlCommand SQLCommand =
               new SqlCommand("INSERT INTO Brand(name) VALUES(@pm_brandname)");
           SqlParameter pm_brandname= new SqlParameter();
           pm_brandname.ParameterName = "@pm_brandname";
           pm_brandname.DbType = DbType.String;
           pm_brandname.Value = a_BrandName;
           SQLCommand.Parameters.Add(pm_brandname);
           this.provider.ExecuteInsertDeleteUpdate(SQLCommand);
       }

3)

public class ModuleInfra : Ninject.Modules.NinjectModule
{
      public override void Load(){
            Bind<IProvider>()
                .To<ProvedorDados()
                .InTransientScope()
                .WithConstructorArgument("ConnectionString", Manage.ConnectionString);
      }
}

オブジェクトを使用した後、Ninject コンテナがクラスDispose()内のメソッドを呼び出すことを保証するにはどうすればよいですか?DataProviderManageBrandDALDataProvider

InTransientScope()このタイプの状況に最適なライフサイクルはありますか? そうでない場合、より適切なものは何ですか?

4

1 に答える 1

4

バインドするDataProvider InTransientScope()と、実際には一時的なスコープはまったくスコープではないため、Ninject によって破棄されません。Ninject は、オブジェクトを作成した後、一時的なスコープにバインドされているオブジェクトを追跡しません。

Ninject はIDisposable、基礎となるスコープ オブジェクトが GC によって収集されるとすぐに、実装するオブジェクトのインスタンスを破棄します (ただし、先ほど述べたように、一時的なスコープにバインドされたオブジェクトにはそのようなスコープ オブジェクトがないため、これは機能しません)。

DataProviderアプリケーションに適した範囲でバインドする必要があります。かもしれない:

  • InRequestScope()Web アプリケーションの場合 (Ninject は、http 要求の終了後に実装するオブジェクトのインスタンスを破棄します-モジュールIDisposableを含めることを忘れないでください)OncePerWebRequest
  • InSingletonScope()- オブジェクトのインスタンスは、アプリケーションのライフサイクル全体で後続のすべてのリクエストに再利用されます - 私の観点からは、次のようなリソースを保持するオブジェクトのオプションではありませんSqlConnection
  • InThreadScope()- オブジェクトのインスタンスは同じスレッド内で再利用されます
  • InScope()- これはカスタム スコープの作成に使用できるため、アプリケーションのタイプに応じて、ニーズに適した独自のカスタム スコープを作成することを検討できます。

追加のスコープ定義を提供する Ninject の興味深い拡張機能もあります: https://github.com/ninject/ninject.extensions.namedscope/wiki

ヒント

  • でと の両方Close()を呼び出す必要はありません。内部で呼び出すので十分です。Dispose()SqlConnectionDispose()Close()
  • コード全体は表示されませんが、破棄することSqlCommandも忘れないでください。
  • Ninjectのインスタンスを作成できる場合は、そのコンストラクターManageBrandDALで使用する必要はありません。InjectAttribute特定の IOC プロバイダーを使用する必要がなくなります。
于 2012-12-14T21:45:30.203 に答える