这是我的情况:(这是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)。

10-08 20:12