基本c#体系结构和类处理问题

基本c#体系结构和类处理问题,c#,architecture,class,C#,Architecture,Class,好了,伙计们,我认为这是非常基本的东西 我只熟悉C#和面向对象语言 这是我正在开发的一个基本项目: namespace MyProject { class MyProject { public Logger Logs = new Logger(); public WebServer Web = new WebServer(); static void Main() { //

好了,伙计们,我认为这是非常基本的东西

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

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

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

        static void Main()
        {  
            // blabla
        }  
    }  
}
记录器只是创建一个日志文件,当调用其“Add(string str)”方法时,它会在日志文件中添加一行。 Web服务器是我自己的Web服务器,正在打开套接字等。。。 我希望我的Web服务器能够使用我的日志添加方法。。。我该如何做到这一点

在我的webserver类中,使用类似“MyProject.Logs.Add(string str)”的东西似乎不起作用。 那么我如何引用它呢? 我不想在我的Web服务器中创建Logger类的新实例,因为我想在同一个文本文件中写入所有内容(我可能会运行更多的模块,而不仅仅是Web服务器)。 所以我想使用在我的主方法中创建的实例,在我的Webserver类中


我希望这是有意义的…

一些建议:

  • 日志
    网站
    应该是私有的。这些是类的实现细节。他们不关别人的事
  • 将记录器的实例传递到web服务器:

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

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

    有几点建议:

  • 日志
    网站
    应该是私有的。这些是类的实现细节。他们不关别人的事
  • 将记录器的实例传递到web服务器:

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

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

    通过将对在
    MyProject
    中创建的
    Logger
    实例的引用传递到
    WebServer
    的实例,可以轻松完成此操作

    WebServer
    类中,可以创建类型为
    Logger
    的属性(getter/setter),以便WebServer知道要使用的记录器。另一种选择(可能更好)是向接受记录器的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(“一些文本…”)的记录器
    然后,在
    Main
    方法中,可以传入
    Logger
    的实例,如下所示:

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

    通过将对在
    MyProject
    中创建的
    Logger
    实例的引用传递到
    WebServer
    的实例,可以轻松完成此操作

    WebServer
    类中,可以创建类型为
    Logger
    的属性(getter/setter),以便WebServer知道要使用的记录器。另一种选择(可能更好)是向接受记录器的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(“一些文本…”)的记录器
    然后,在
    Main
    方法中,可以传入
    Logger
    的实例,如下所示:

    namespace MyProject  
    {  
        class MyProject  
        {
            public static Logger Logs = new Logger();
            public static WebServer Web;
    
            static void Main()
            {  
                Web = new WebServer(Logs);
            }  
        }  
    }
    
    MyProject.Logs.Add(string str)
    不起作用,因为
    Logs
    成员不是静态的,这意味着它对于类的不同实例(由操作符
    new
    创建)可能不同。如果不指定实例,编译器将无法知道引用的是哪个实例

    如果将
    日志
    标记为
    静态
    ,则它将工作

    但是,将其设置为静态会降低项目的可定制性(例如,您将无法在同一程序中使用两个不同的日志文件启动两个web服务器)。这就是为什么约翰·桑德斯(John Saunders)的建议通常被认为是更好的。

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

    如果将
    日志
    标记为
    静态
    ,则它将工作


    但是,将其设置为静态会降低项目的可定制性(例如,您将无法在同一程序中使用两个不同的日志文件启动两个web服务器)。这就是为什么约翰·桑德斯的建议通常被认为更好。

    这不会编译。您正在从静态方法访问实例成员。很好的调用,从OP复制。这是我在编辑器中键入的结果,而不是VS。谢谢,这与John Saunders说的差不多,我感谢您的帮助tho:)这不会编译。您正在从静态方法访问实例成员。很好的呼叫,从OP复制。这是我在编辑器中键入的结果,而不是VS。谢谢,这与John Saunders说的差不多,我感谢您的帮助tho:)谢谢您的快速回答,是的,我意识到日志和Web应该是私有的,我把它们公之于众,希望能够通过这种方式访问它们,但我错了:)谢谢你的快速回答,是的,我意识到日志和网络应该是私有的,我把它们公之于众,希望能够通过这种方式访问它们,但我错了:)您可能想签出log4net作为您自己的日志代码。您可能想签出log4net作为您自己的日志代码。很有趣。就像你说的,我想我会同意John所说的,它确实提供了比使这些静态的有趣的更大的灵活性。就像你说的,我想我会同意John所说的,它确实提供了比制作这些静态文件更大的灵活性。