这是我的情况:(这是ASP.net MVC 5的控制器)
public class Class1
{
public Class1()
{
}
public void MethodA()
{
UserBLL bll = new UseBLL();
// some code that call method from bll
}
public void MethodB()
{
UserBLL bll = new UseBLL();
// some code that call method from bll
}
}
我使用UseBLL两次。 (可能再十次)。因此,我认为我应该像这样声明一个对象成员。
public class Class1
{
UserBLL bll;
public Class1()
{
bll = new UseBLL();
}
public void MethodA()
{
// some code that call method from bll
}
public void MethodB()
{
// some code that call method from bll
}
}
这是一个明智的决定吗?如果没有,为什么?
我应该将
UserBLL bll;
更改为UserBLL bll {set;get };
(何时需要执行此操作?)谢谢大家的帮助:)
最佳答案
这取决于。 :)
您需要考虑的事情是:
状态(UserBLL
保持状态,您是否要保留状态?)
线程安全(多个线程可以同时访问它并导致损坏吗?)
创建它的成本是多少?
但是,我在这里的典型方法是应用依赖倒置原则。这意味着UserBLL
将实现一个接口,并且在创建Class1
的实例时,构造函数将提供实现IUserBLL
的类并将其存储在private readonly
字段中。
例:
public class Class1
{
private readonly IUserBLL _userBll;
public Class1(IUserBLL userBll)
{
// Null checks here...
_userBll = userBll;
}
public void Method()
{
_userBll.DoSomething();
}
}
您仍然需要考虑上述前两点,但是现在您有了一致的方法,无需担心
_userBll
的确切含义,并且可以更改它而不会影响Class1
。通常,使用IoC容器(有时称为“ DI容器”或“ DI框架”)来实现将对象注入构造函数的这种情况。
因此,后续阅读:
依赖倒置原则
控制容器的反转(例如:Ninject,Castle.Windsor,StructureMap,Autofac)。