[英]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.