如何在 C# 中使用 Autofac 而不是单例?

How do I use Autofac instead singleton in c#?

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

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
}

我试过在 global.asax 中使用 Autofac:

 protected void Application_Start()
 {
     var builder = new ContainerBuilder();
     builder.RegisterType<MemoryCacheManager>().SingleInstance(); 
 }

MyClass 构造函数中:

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

public string Translate(string language)
{   
    var translation = _cacheManager.GetValueFromCache();
}

我想在Index.cshtml

中调用这个方法

之前我是这样直接做的:

<h4>@MyClass.Language.Translate("Welcome", Model.Language)</h4>

正如我 LanguageMyClass 中所遵循的那样:

public static Localizer Language { get { return _Lazy.Value; } }

但是现在我没有这个属性。

How can I call Translate method in Index.cshtml as I do not have static property like previous.

您只需将 MyClass 注册为 SingleInstance 到您的容器:

var builder = new ContainerBuilder();
builder.RegisterType<MyClass>().As<IMyClass>().SingleInstance();

然后在你需要的地方注入:

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

虽然它可能是您想要的单个实例的缓存。在那种情况下:

builder.RegisterType<MemoryCacheManager>().SingleInstance();

然后:

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

编辑:

您需要做的第一件事是在 Application_Start class 中设置 DependencyResolver(为此您需要获取 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));
}

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

public class TestController : Controller
{
    private readonly IMyClass _myClass;

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

    // Rest of the controller
}

然后当您为您创建模型时,从 MyClass:

获取您需要的数据
public ActionResult Index()
{
    var model = new ExampleModel 
        { 
            WelcomeMessage = _myClass.Translate("Welcome") 
        };

    return View(model);
}

在您看来:

<h4>@Model.WelcomeMessage</h4>