C# 我如何保证Ninject会自动调用Disposable()?
1)C# 我如何保证Ninject会自动调用Disposable()?,c#,ninject,C#,Ninject,1) public class DataProvider : IProvider , IDisposable{ private SqlConnection connection = null; public DataProvider(string ConnectionString) { this.connection = new SqlConnection(ConnectionString); this.connecti
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();
}
}
}
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);
}
public class ModuleInfra : Ninject.Modules.NinjectModule
{
public override void Load(){
Bind<IProvider>()
.To<ProvedorDados()
.InTransientScope()
.WithConstructorArgument("ConnectionString", Manage.ConnectionString);
}
}
2)
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();
}
}
}
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);
}
public class ModuleInfra : Ninject.Modules.NinjectModule
{
public override void Load(){
Bind<IProvider>()
.To<ProvedorDados()
.InTransientScope()
.WithConstructorArgument("ConnectionString", Manage.ConnectionString);
}
}
3)
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();
}
}
}
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);
}
public class ModuleInfra : Ninject.Modules.NinjectModule
{
public override void Load(){
Bind<IProvider>()
.To<ProvedorDados()
.InTransientScope()
.WithConstructorArgument("ConnectionString", Manage.ConnectionString);
}
}
公共类模块infra:Ninject.Modules.Ninject模块
{
公共覆盖无效负载(){
绑定()
.To当您绑定数据提供程序时,Ninject不会处理它,因为实际上临时作用域根本不是作用域。Ninject不会跟踪临时作用域中绑定的对象,因为它会为您创建一个对象
只要GC收集到底层范围对象,Ninject就会处理实现IDisposable
的对象实例(但正如我所说的,这不适用于绑定到临时范围的对象,因为没有这样的范围对象)
您应该在适用于您的应用程序的范围内绑定数据提供程序。它可以是:
InRequestScope()
用于web应用程序(在http请求结束后,Ninject将处理实现IDisposable
的对象实例-不要忘记包括OncePerWebRequest
模块)
InSingletonScope()
-在应用程序的整个生命周期中,对象的实例将被重新用于所有后续请求-从我的角度来看,它不是持有资源的对象(如SqlConnection
InThreadScope()
-对象的实例将在同一线程中重复使用
>代码>内幕()/<代码> -这可用于创建自定义范围,因此根据应用程序的类型,您可以考虑创建适合您需要的自定义范围。
Ninject还有一些有趣的扩展,提供了更多的范围定义:
暗示
- 您不需要在
SqlConnection上同时调用Close()
和Dispose()
,Dispose()
就足够了,因为它在内部调用Close()
- 我看不到完整的代码,但不要忘了处理
SqlCommand
- 如果允许在Ninject上创建
managebrandal
的实例,则无需在其构造函数上使用InjectAttribute
。这将使您不必使用特定的IOC提供程序
为什么让连接保持打开您的数据提供程序
类?如果您在单个方法内打开和关闭连接,则不需要实现一次性
。除了保持数据库连接打开外,我相信还有一条一般规则,构造函数不应抛出异常。您的设计很容易发生这种情况。那么看看这里@Yuck避免在构造函数中抛出异常的理由是什么?我见过的唯一一个这样的地方是在Symbian操作系统上,在Symbian操作系统上,平台施加的限制使得基于约定的两阶段构造等丑陋的黑客成为必要。亲爱的Mipe34,什么范围更适合适用于Windows服务,此应用程序将每隔20秒打开/关闭数据库连接以更新某些表?谢谢,事先。我对Windows服务了解不多。但我会使用InScope()
方法选择自定义作用域,对于InNamedScope()
或InParentScope()可能更好
来自ninject extensions。阅读这篇关于如何使用附加作用域的文章。瞬态
作用域中的对象如何以及何时被处置?当它们被垃圾收集时。请参阅以下内容: