开发者

C# - Global Program Object

Sc开发者_运维知识库enario

I have a non-static class that wraps around Log4Net. This is really handy as it links up to a further application I have that displays logs of different processes that occur in a variety of software that I write (to allow me to see where errors occur, batch processes fail etc.)

Problem

This is all well and good, but if I want to log an entire process, I have to do a series of things:

  1. Instantiate the Logging object.
  2. Tell it to begin.
  3. Log stuff.
  4. Tell it to stop.

This means that if a process runs outside of the class I have to mess about passing the Logging object around which is a pain and looks messy.

Question

How can I essentially just declare the object in such a way that It is globally accessible by all the classes......and making it static isn't really an option, I don't think.

.....This could be a waste of time but I like opinions.


Why do you believe that making "it" static isn't an option? I suspect you're confusing the ideas of a static class and a static variable which maintains a reference to an instance of a non-static class.

public class Foo
{
    // Instantiate here, or somewhere else
    private static LogWrapper logWrapper = new LogWrapper(...); 
    public static LogWrapper LogWrapper { get { return logWrapper; } }
}

Just because the class is non-static doesn't mean you can't have a singleton instance of it which is globally available. Normally not such a good idea, but not too bad for logging.

If you do go down the singleton route, you may want to consider reading my article on implementing a singleton in C#.


It sounds like you want a singleton.

You can make a static property that returns the single instance of your class.


Rather than going down the static path or the Singleton path, you could investigate using Dependency Injection (DI) with an IoC Container framework. This would keep your classes testable and would decouple them from the logging class.

The IoC Container will handle lifetime management for you; by specifying container lifetime, you can simulate a Singleton with none of the disadvantages.

There is a learning curve, but it's worth it; DI has many other advantages.

EDIT: The trick is to avoid the Service Locator trap. Mark Seemann has some nice articles on this (and a book coming out).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜