何时在C#中声明成员方法

时间:2014-05-23 08:06:14

标签: c#

这是我的情况:(这是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 };(我何时需要这样做?)

感谢所有帮助:)

4 个答案:

答案 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框架")实现的。

所以后续阅读:

  • 依赖性倒置原则
  • 控制容器的反转(例如:Ninject,Castle.Windsor,StructureMap,Autofac)。

答案 1 :(得分:1)

是的,将bll放在班级上似乎是个好主意。

既然你做了private(含蓄地),这也是一个好主意,就像你一样只有一个字段就可以了;您似乎不需要属性(getset)。

我建议您将字段标记为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)

这似乎不是技术问题,而是概念问题。 如您所知,类表示对象的定义,在这种情况下,您必须问自己几个问题:

  • UserBLL类属于class1还是属于方法?
  • 从班级创建对象时是否需要使用UserBLL?

喜欢

Class1 c = new Class1();
c.UserBll.MethodA(...)
  • UserBLL是否仅用于该方法并且不会被重用?
  • ...

如果您将UserBLL声明为该类的属性,则UserBLL将属于该类。 思考概念和使用,你就会知道如何设计课程。

在您的情况下,如果您在所有方法中使用UserBLL类,我认为您可以将其添加为属性,如果您需要在类的方法之外,可以将其公开使用get,否则为私有,如果你需要通过另一种方法来改变它,而不是你的classe中你可以在你的属性中添加set ...