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 方法,因为我没有像以前那样的静态属性。
您只需要在您的容器中注册MyClass为SingleInstance:
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)
| 归档时间: |
|
| 查看次数: |
7010 次 |
| 最近记录: |