簡體   English   中英

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

[英]How do I use Autofac instead singleton in c#?

我已經使用單例模式一個使用靜態屬性,構造函數

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>

由於我在MyClass具有以下Language

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

但是現在我沒有此屬性。

我沒有前面的靜態屬性,因此如何在Index.cshtml中調用Translate方法。

您只需要使用容器將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類中設置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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM