基本的c#架构和类处理问题

时间:2010-06-19 02:26:12

标签: c# architecture class

好的,我认为这是非常基本的东西。

我只熟悉C#和面向对象的语言。

所以这是我正在开发的一个基本项目:

namespace MyProject  
{  
    class MyProject  
    {
        public Logger Logs = new Logger();
        public WebServer Web = new WebServer();

        static void Main()
        {  
            // blabla
        }  
    }  
}

记录器只是创建一个日志文件,当调用其“Add(string str)”方法时,它会在日志文件中添加一行。 网络服务器是我自己的网络服务器,打开套接字等...... 我希望我的网络服务器能够使用记录器的Add方法......我应该如何实现呢?

在我的webserver类中,使用类似“MyProject.Logs.Add(string str)”的东西似乎不起作用。 那我怎么能参考呢? 我不想在我的网络服务器中创建我的Logger类的新实例,因为我想在同一个文本文件中编写每个实例(我可能运行的模块多于网络服务器)。 所以我想使用我在Main方法中创建的实例,在我的Webserver类中...

我希望这是有道理的......

3 个答案:

答案 0 :(得分:4)

一些建议:

  1. LogsWeb应该是私密的。这些是您班级的实施细节。他们是别人的事。
  2. 将记录器的实例传递给您的Web服务器:

    public WebServer Web = new WebServer(Logs); 
    
  3. 您的网络服务器现在可以拥有自己的副本:

    private Logger Logs {get;set;}
    
    public WebServer(Logger logs)
    {
        Logs = logs;
    }
    
    public void DoSomething()
    {
        Logs.Add("I did something!");
    }
    

答案 1 :(得分:4)

MyProject.Logs.Add(string str)不起作用,因为Logs成员不是静态的,这意味着它对于类的不同实例(由运算符new创建)可能不同。如果您没有指定,则编译器无法知道您引用的实例。

如果您将Logs标记为static,那么它将有效。

但是,将其设置为静态会使您的项目更少可自定义(例如,您将无法在同一程序中启动两个具有两个不同日志文件的Web服务器)。这就是 John Saunders 建议通常被认为更好的原因。

答案 2 :(得分:1)

您可以通过将Logger实例内的MyProject实例的引用传递给WebServer的实例来轻松完成此操作。

WebServer类中,您可以创建类型为Logger的属性(getter / setter),以便WebServer知道您要使用的Logger。另一种替代方法(可能更好)是将参数添加到采用Logger的WebServer的构造函数中。用于添加属性的伪代码:

public class WebServer
{
    public WebServer(Logger l)
    {
        Log = l;
    }

    //relevant code....
    public Logger Log { get; set; } //Short hand property declaration, see http://msdn.microsoft.com/en-us/library/bb384054.aspx
}

WebServer类内部,您可以使用Logger.Add("some text...");之类的记录器 然后,在Main方法中,您可以像这样传递Logger的实例:

namespace MyProject  
{  
    class MyProject  
    {
        public static Logger Logs = new Logger();
        public static WebServer Web;

        static void Main()
        {  
            Web = new WebServer(Logs);
        }  
    }  
}