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()
这种情况的最佳生命周期是什么?如果没有,哪个更合适?
答案 0 :(得分:4)
绑定DataProvider
InTransientScope()
时,Ninject不会处理它,因为实际上瞬态范围根本不是范围。 Ninject在为您创建一个对象后,不会跟踪在瞬态范围内绑定的对象。
一旦GC收集了基础范围对象,Ninject就会处理实现IDisposable
的对象的实例(但正如我所说,这对于绑定到瞬态范围的对象不起作用,因为没有这样的范围对象)。
您应该在适用于您的应用程序的范围内绑定DataProvider
。它可能是:
InRequestScope()
用于Web应用程序(Ninject将在http请求结束后部署实现IDisposable
的对象实例 - 不要忘记包含OncePerWebRequest
模块)InSingletonScope()
- 在应用程序的整个生命周期中,对象的实例将被重用于所有后续请求 - 从我的观点来看,它不是包含SqlConnection
等资源的对象的选项InThreadScope()
- 对象实例将在同一个线程中重复使用InScope()
- 这可以用于创建自定义范围,因此根据您的应用程序类型,您可以考虑创建适合您需要的自定义范围。 Ninject还有一些有趣的扩展,提供了额外的范围定义:https://github.com/ninject/ninject.extensions.namedscope/wiki
提示
Close()
上的Dispose()
和SqlConnection
。 Dispose()
就足够了,因为它在内部调用了Close()
。SqlCommand
。ManageBrandDAL
的实例,则不需要在其构造函数上使用InjectAttribute
。它会解决您使用特定IOC提供商的问题。