首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何保证Ninject将自动调用Disposable()?

如何保证Ninject将自动调用Disposable()?
EN

Stack Overflow用户
提问于 2012-12-12 00:56:52
回答 1查看 4K关注 0票数 4

1)

代码语言:javascript
复制
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)

代码语言:javascript
复制
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)

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

Dispose()使用DataProvider对象之后,如何保证Ninject容器将在ManageBrandDAL类中调用方法DataProvider

对于这种情况,InTransientScope()是最好的生命周期吗?如果没有,还有什么更合适呢?

EN

回答 1

Stack Overflow用户

发布于 2012-12-14 21:45:30

当您绑定您的DataProvider InTransientScope()时,它将不会被Ninject处理,因为实际上瞬态作用域根本不是作用域。Ninject不会跟踪那些在临时作用域中绑定的对象,因为它将为您创建一个对象。

一俟GC收集到底层范围对象(但正如我所说的,这不适用于绑定到瞬态作用域的对象,因为没有这样的作用域对象),Ninject就会处理实现IDisposable的对象的实例。

您应该在范围内绑定您的DataProvider,这对您的应用程序是合适的。它可以是:

  • InRequestScope() for web应用程序(Ninject将在http请求结束后释放实现IDisposable的对象的实例-不要忘记包括OncePerWebRequest模块)
  • 在应用程序的整个生命周期中,对象的实例将被用于所有后续请求--从我的观点来看,它不是保存像InSingletonScope()这样的资源的对象的选项。
  • 对象的InThreadScope()实例将在同一个线程中重用。
  • InScope() --这可以用于创建自定义作用域,因此根据应用程序的类型,您可以考虑创建适合您需要的自定义作用域。

尼尼姆也有一些有趣的扩展,它提供了额外的范围定义:https://github.com/ninject/ninject.extensions.namedscope/wiki

提示

  • 您不需要在您的Close()上同时调用Dispose()SqlConnectionDispose()就足够了,因为它在内部调用Close()
  • 我没有看到整个代码,但也不要忘记释放SqlCommand
  • 如果允许在Ninject上创建ManageBrandDAL实例,则不需要在其构造函数上使用InjectAttribute。它将使您不使用特定的IOC提供程序。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13831075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档