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 Container 在使用对象后会调用Dispose()类中DataProvider的方法?ManageBrandDALDataProvider

这种InTransientScope()情况的最佳生命周期是什么?如果不是,什么更合适?

4

1 回答 1

4

当你绑定你的DataProvider InTransientScope()时,它不会被 Ninject 处理,因为实际上瞬态作用域根本就没有作用域。Ninject 在为您创建对象后,不会跟踪绑定在瞬态范围内的对象。

NinjectIDisposable在底层范围对象被 GC 收集后立即处理实现的对象实例(但正如我所说,这不适用于绑定到瞬态范围的对象,因为没有这样的范围对象)。

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

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

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

提示

  • 您无需同时调用Close()Dispose()在您的SqlConnection. Dispose()就足够了,因为它在Close()内部调用。
  • 我没有看到整个代码,但也不要忘记处理SqlCommand
  • 如果您让创建ManageBrandDALon Ninject 的实例,则不需要InjectAttribute在其构造函数上使用。它将使您摆脱使用特定 IOC 提供商的束缚。
于 2012-12-14T21:45:30.203 回答