ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 如何保证Ninject会自动调用Disposable()?

2019-06-25 14:53:36  阅读:191  来源: 互联网

标签:c ninject


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

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

InTransientScope()是这种情况的最佳生命周期吗?如果没有,哪个更合适?

解决方法:

绑定DataProvider InTransientScope()时,它不会被Ninject处理,因为实际上瞬态范围根本不是范围. Ninject在为您创建一个对象后,不会跟踪在瞬态范围内绑定的对象.

一旦GC收集了基础范围对象,Ninject就会处理实现IDisposable的对象实例(但正如我所说,这对于绑定到瞬态范围的对象不起作用,因为没有这样的范围对象).

您应该在适合您的应用程序的范围内绑定DataProvider.它可能是:

>用于Web应用程序的InRequestScope()(Ninject将在http请求结束后部署实现IDisposable的对象实例 – 不要忘记包含OncePerWebRequest模块)
> InSingletonScope() – 在应用程序的整个生命周期中,对象实例将被重用于所有后续请求 – 从我的观点来看,对于持有SqlConnection等资源的对象,它不是一个选项
> InThreadScope() – 对象的实例将在同一个线程中重用
> InScope() – 这可以用于创建自定义范围,因此根据应用程序的类型,您可以考虑创建适合您需要的自定义范围.

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

提示

>您不需要在SqlConnection上同时调用Close()和Dispose(). Dispose()就足够了,因为它在内部调用Close().
>我没有看到整个代码,但也不要忘记处理SqlCommand.
>如果您在Ninject上创建ManageBrandDAL实例,则不需要在其构造函数上使用InjectAttribute.它会解决您使用特定IOC提供程序的问题.

标签:c,ninject
来源: https://codeday.me/bug/20190625/1286975.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有