这是我的情况:(这是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 };
(我何时需要这样做?)
感谢所有帮助:)
答案 0 :(得分:3)
这取决于。 :)
您需要考虑的事项是:
UserBLL
是否维持状态,你是否希望保留状态?)但是,我在这里的典型方法是应用依赖性倒置原则。这意味着UserBLL
将实现一个接口,并且在创建Class1
的实例时,构造函数将提供一个实现IUserBLL
的类并将其存储在private readonly
字段中。 / p>
示例:
public class Class1
{
private readonly IUserBLL _userBll;
public Class1(IUserBLL userBll)
{
// Null checks here...
_userBll = userBll;
}
public void Method()
{
_userBll.DoSomething();
}
}
你仍然需要考虑上面的前两点,但现在你有一个一致的方法,你不需要担心_userBll
到底是什么,并且可以改变它而不影响{ {1}}。
通常,这种将对象注入构造函数的场景是使用IoC容器(有时称为" DI容器"或" DI框架")实现的。
所以后续阅读:
答案 1 :(得分:1)
是的,将bll
放在班级上似乎是个好主意。
既然你做了private
(含蓄地),这也是一个好主意,就像你一样只有一个字段就可以了;您似乎不需要属性(get
和set
)。
我建议您将字段标记为readonly
,因为您只想在实例构造函数中为其分配。
正如在对您的问题的评论中所说,您可能还会考虑让实例构造函数接受参数,如:
public class Class1
{
readonly UserBLL bll;
public Class1(UserBLL bll)
{
this.bll = bll;
}
// ...
或者也许:
public class Class1
{
readonly UserBLL bll;
public Class1(UserBLL bll)
{
this.bll = bll;
}
public Class1() : this(new UserBLL())
{
}
// ...
答案 2 :(得分:0)
如果您希望使用UserBLL大量曝光它可能有一些优点,主要是更容易访问。但是我会小心暴露setter,因为使用你的主类的客户端将能够改变它。您可以仅使用getter来阻止它:
private UserBLL _Bll;
internal UserBLL Bll
{
get
{
return _Bll;
}
}
但是,如果UserBLL中的方法的外部使用仅在有限数量的情况下发生(例如您提供的两种方法)并且您需要使用类中的数据修改UserBLL的结果然后公开UserBLL通过课堂上的方法是一个更实际的决定。
要完成它,你的决定应该取决于:
1)您希望拥有UserBLL的曝光级别 2)UserBLL和Class1之间的交互程度
答案 3 :(得分:0)
这似乎不是技术问题,而是概念问题。 如您所知,类表示对象的定义,在这种情况下,您必须问自己几个问题:
喜欢
Class1 c = new Class1();
c.UserBll.MethodA(...)
如果您将UserBLL声明为该类的属性,则UserBLL将属于该类。 思考概念和使用,你就会知道如何设计课程。
在您的情况下,如果您在所有方法中使用UserBLL类,我认为您可以将其添加为属性,如果您需要在类的方法之外,可以将其公开使用get,否则为私有,如果你需要通过另一种方法来改变它,而不是你的classe中你可以在你的属性中添加set ...