C# 我如何保证Ninject会自动调用Disposable()?

C# 我如何保证Ninject会自动调用Disposable()?,c#,ninject,C#,Ninject,1) public class DataProvider : IProvider , IDisposable{ private SqlConnection connection = null; public DataProvider(string ConnectionString) { this.connection = new SqlConnection(ConnectionString); this.connecti

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

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

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();
          }
       }
}
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);
       }
public class ModuleInfra : Ninject.Modules.NinjectModule
{
      public override void Load(){
            Bind<IProvider>()
                .To<ProvedorDados()
                .InTransientScope()
                .WithConstructorArgument("ConnectionString", Manage.ConnectionString);
      }
}
公共类模块infra:Ninject.Modules.Ninject模块
{
公共覆盖无效负载(){
绑定()

.To当您绑定
数据提供程序时,Ninject不会处理它,因为实际上临时作用域根本不是作用域。Ninject不会跟踪临时作用域中绑定的对象,因为它会为您创建一个对象

只要GC收集到底层范围对象,Ninject就会处理实现
IDisposable
的对象实例(但正如我所说的,这不适用于绑定到临时范围的对象,因为没有这样的范围对象)

您应该在适用于您的应用程序的范围内绑定
数据提供程序。它可以是:

  • InRequestScope()
    用于web应用程序(在http请求结束后,Ninject将处理实现
    IDisposable
    的对象实例-不要忘记包括
    OncePerWebRequest
    模块)
  • InSingletonScope()
    -在应用程序的整个生命周期中,对象的实例将被重新用于所有后续请求-从我的角度来看,它不是持有资源的对象(如
    SqlConnection
  • InThreadScope()
    -对象的实例将在同一线程中重复使用
  • >代码>内幕()/<代码> -这可用于创建自定义范围,因此根据应用程序的类型,您可以考虑创建适合您需要的自定义范围。
Ninject还有一些有趣的扩展,提供了更多的范围定义:

暗示

  • 您不需要在
    SqlConnection上同时调用
    Close()
    Dispose()
    Dispose()
    就足够了,因为它在内部调用
    Close()
  • 我看不到完整的代码,但不要忘了处理
    SqlCommand
  • 如果允许在Ninject上创建
    managebrandal
    的实例,则无需在其构造函数上使用
    InjectAttribute
    。这将使您不必使用特定的IOC提供程序

为什么让连接保持打开您的
数据提供程序
类?如果您在单个方法内打开和关闭连接,则不需要实现
一次性
。除了保持数据库连接打开外,我相信还有一条一般规则,构造函数不应抛出异常。您的设计很容易发生这种情况。那么看看这里@Yuck避免在构造函数中抛出异常的理由是什么?我见过的唯一一个这样的地方是在Symbian操作系统上,在Symbian操作系统上,平台施加的限制使得基于约定的两阶段构造等丑陋的黑客成为必要。亲爱的Mipe34,什么范围更适合适用于Windows服务,此应用程序将每隔20秒打开/关闭数据库连接以更新某些表?谢谢,事先。我对Windows服务了解不多。但我会使用
InScope()
方法选择自定义作用域,对于
InNamedScope()
InParentScope()可能更好
来自ninject extensions。阅读这篇关于如何使用附加作用域的文章。
瞬态
作用域中的对象如何以及何时被处置?当它们被垃圾收集时。请参阅以下内容: