如何在 C# 中使用 Autofac 代替单例?

Neo*_*Neo 3 c# asp.net-mvc singleton autofac c#-4.0

我使用了单例模式,使用静态属性、构造函数

public class MyClass 
{
    private readonly MemoryCacheManager _cacheManager;
    private static readonly Lazy<MyClass> _Lazy = new Lazy<MyClass>(() => new MyClass());
    public static MyClass Language { get { return _Lazy.Value; } }

    private MyClass()
    {
        _cacheManager = new MemoryCacheManager();          
        LoadCacheData();
    }

    // Rest of class
}
Run Code Online (Sandbox Code Playgroud)

我尝试过使用 Autofac 进行如下操作global.asax

 protected void Application_Start()
 {
     var builder = new ContainerBuilder();
     builder.RegisterType<MemoryCacheManager>().SingleInstance(); 
 }
Run Code Online (Sandbox Code Playgroud)

以及MyClass构造函数内部:

private MyClass(MemoryCacheManager cache)
{
    _cacheManager = cache;
    LoadCacheData();
}

public string Translate(string language)
{   
    var translation = _cacheManager.GetValueFromCache();
}
Run Code Online (Sandbox Code Playgroud)

我想调用这个方法Index.cshtml

以前我是直接这样做的:

<h4>@MyClass.Language.Translate("Welcome", Model.Language)</h4>
Run Code Online (Sandbox Code Playgroud)

正如我Language所言MyClass

public static Localizer Language { get { return _Lazy.Value; } }
Run Code Online (Sandbox Code Playgroud)

但现在我没有这个财产了。

我如何调用 Index.cshtml 中的 Translate 方法,因为我没有像以前那样的静态属性。

Rag*_*lly 6

您只需要在您的容器中注册MyClassSingleInstance

var builder = new ContainerBuilder();
builder.RegisterType<MyClass>().As<IMyClass>().SingleInstance();
Run Code Online (Sandbox Code Playgroud)

然后在需要的地方注入:

public AnotherClass(IMyClass myClass)
{
     _myClass = myClass;
}
Run Code Online (Sandbox Code Playgroud)

尽管它可能是您想要单个实例的缓存。在这种情况下:

builder.RegisterType<MemoryCacheManager>().SingleInstance();
Run Code Online (Sandbox Code Playgroud)

进而:

public MyClass(MemoryCacheManager cache)
{
    _cacheManager = cache;          
    LoadCacheData();
}
Run Code Online (Sandbox Code Playgroud)

编辑:

您需要做的第一件事是DependencyResolver在您的Application_Start类中设置(您需要为此获取Autofac MVC Integration NuGet 包):

protected void Application_Start()
{
    this.RegisterAutoFac();

    // Rest of method
}

private void RegisterAutoFac()
{
    var builder = new ContainerBuilder();

    builder.RegisterControllers(typeof(MvcApplication).Assembly);

    builder.RegisterType<MyClass>().As<IMyClass>();
    builder.RegisterType<MyCache>().As<IMyCache>().SingleInstance();

    var container = builder.Build();

    // Setup the dependency resolver
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
Run Code Online (Sandbox Code Playgroud)

然后你需要注入MyClass到控制器的构造函数中:

public class TestController : Controller
{
    private readonly IMyClass _myClass;

    public TestController(IMyClass myClass)
    {
        _myClass = myClass;
    }

    // Rest of the controller
}
Run Code Online (Sandbox Code Playgroud)

然后,当您为您创建模型时,可以从以下位置获取所需的数据MyClass

public ActionResult Index()
{
    var model = new ExampleModel 
        { 
            WelcomeMessage = _myClass.Translate("Welcome") 
        };

    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

而在你看来:

<h4>@Model.WelcomeMessage</h4>
Run Code Online (Sandbox Code Playgroud)