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);
}
}在Dispose()使用DataProvider对象之后,如何保证Ninject容器将在ManageBrandDAL类中调用方法DataProvider?
对于这种情况,InTransientScope()是最好的生命周期吗?如果没有,还有什么更合适呢?
发布于 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()和SqlConnection。Dispose()就足够了,因为它在内部调用Close()。SqlCommand。ManageBrandDAL实例,则不需要在其构造函数上使用InjectAttribute。它将使您不使用特定的IOC提供程序。https://stackoverflow.com/questions/13831075
复制相似问题