从任何地方

时间:2017-01-11 19:20:17

标签: c#

是否存在某种技巧,设计模式或其他通用方式使对象“全局”可用,因此您可以根据需要从应用程序访问对象,以便可以加载加载过程应用程序(无论是桌面应用程序,如控制台,还是Web应用程序,如MVC)

我基本上在寻找可以在主启动方法中初始化的东西,它可以在不必将它传递给每个方法来使用它的情况下使用,同时它保留了它初始化的状态和属性。

2 个答案:

答案 0 :(得分:3)

正如我在评论中提到的,这看起来像XY Problem。而不是真正做全局变量,大多数人在堆栈上溢出的感觉是禁止的,我相信正确的解决方案是只使用IoC / DI。我更喜欢使用Autofac(没有联盟,有很多DI框架可供选择)。这允许每个对象简单地请求(通过构造函数注入或不推荐的属性注入方法)它需要使用的对象才能正常运行。这减少了耦合,可以帮助测试代码(单元测试)。

using System;
using Autofac;

public class Program
{
    public static void Main()
    {
        // Start configuring DI
        IoCConfig.Start();

        // Start "scope" in which Autofac builds objects "in"
        using(var scope = IoCConfig.Container.BeginLifetimeScope())
        {
            // Resolve the Worker
            // Autofac takes care of the constructing of the object
            // and it's required parameters
            var worker = scope.Resolve<Worker>();

            worker.DoWork();
        }
    }
}

// the class that does work, it needs the Configuration information
// so it is added to the constructor parameters
public class Worker
{
    private readonly string _connectionString;

    public Worker(IConfiguration config)
    {
        _connectionString = config.ConnectionString;
    }

    public void DoWork()
    {
        // Connect to DB and do stuff
        Console.WriteLine(_connectionString);
    }
}

public static class IoCConfig
{
    public static IContainer Container { get; private set; }

    public static void Start()
    {
        var builder = new ContainerBuilder();


        // Register Global Configuration
        builder.Register(c => new Configuration{
            ConnectionString = "my connection string" // or ConfigurationManager.ConnnectionString["MyDb"].ConnectionString;
        })
            .As<IConfiguration>();

        // Register an concrete type for autofac to instantiate
        builder.RegisterType<Worker>();

        Container = builder.Build();
    }

    private class Configuration : IConfiguration
    {
        public string ConnectionString { get; set; }
    }

}

public interface IConfiguration
{
    string ConnectionString { get; }
}

答案 1 :(得分:1)

我认为你正在寻找单身人士模式

https://msdn.microsoft.com/en-us/library/ff650316.aspx