是否存在某种技巧,设计模式或其他通用方式使对象“全局”可用,因此您可以根据需要从应用程序访问对象,以便可以加载加载过程应用程序(无论是桌面应用程序,如控制台,还是Web应用程序,如MVC)
我基本上在寻找可以在主启动方法中初始化的东西,它可以在不必将它传递给每个方法来使用它的情况下使用,同时它保留了它初始化的状态和属性。
答案 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)
我认为你正在寻找单身人士模式