如何在 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>
正如我 Language
在 MyClass
中所遵循的那样:
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>
我使用了单例模式 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>
正如我 Language
在 MyClass
中所遵循的那样:
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>