Asp.net mvc Unity.MVC4懒惰<;T>;在ASP.NET MVC应用程序中不工作
我正在使用ASP.NETMVC4应用程序 主控制器的构造函数由2个参数(Iservice1 service1、Iservice2 service2)参数化 并非所有代码路径都使用任何服务(service1、service2),只有在某些代码路径中我需要service1实例/对象或service2实例/对象Asp.net mvc Unity.MVC4懒惰<;T>;在ASP.NET MVC应用程序中不工作,asp.net-mvc,inversion-of-control,lazy-loading,unity-container,deferred-loading,Asp.net Mvc,Inversion Of Control,Lazy Loading,Unity Container,Deferred Loading,我正在使用ASP.NETMVC4应用程序 主控制器的构造函数由2个参数(Iservice1 service1、Iservice2 service2)参数化 并非所有代码路径都使用任何服务(service1、service2),只有在某些代码路径中我需要service1实例/对象或service2实例/对象 我不想使用container.Resolve一般来说,实例构造函数只需执行适当的空检查并存储传入的引用。这使得对象图的构造更加快速和简单。任何初始化都应该推迟到稍后的某个时刻,即组件第一次使用
我不想使用container.Resolve一般来说,实例构造函数只需执行适当的空检查并存储传入的引用。这使得对象图的构造更加快速和简单。任何初始化都应该推迟到稍后的某个时刻,即组件第一次使用的时候
这将在大多数情况下防止延迟为性能创建一个组件,如果这仍然是一个问题,您可能需要考虑一个具有./P>的容器。 对于那些需要延迟创建的空闲时间,不要为此使用
Lazy
。注入Lazy
是一种选择,就像将IDisposable
放置在接口上一样。注入一个惰性漏洞,因为从理论上讲,每个依赖都可能很慢,或者需要推迟。为了避免在引入较慢的服务实现时在整个应用程序中进行彻底的更改,我们最好先将应用程序中的每个依赖项设置为“惰性”,因为这样可以避免我们以后进行更改
但这当然是愚蠢和丑陋的。但是,即使应用程序足够小,这样的全面更改是可以负担的,消费者为什么要知道或关心服务需要延迟初始化这一事实呢?这不是一个实现细节吗?为什么我们要将这种懒惰的行为写入这个服务的契约中?这样做会使我们需要编写的代码和测试更加复杂。那是不必要的
因此,您不应该注入一个Lazy
,而应该只注入一个IService1
,并实现和注册一个实现Lazy行为的代理。这实际上很容易做到,如下所示:
公共类LazyService1Proxy:IService1
{
私人懒惰服务;
公共懒散服务1代理(懒散服务){
服务=服务;
}
void IService1.Method1(){
this.service.Value.Method1();
}
对象IService1.Method2(字符串foo){
返回this.service.Value.Method2(foo);
}
}
此代理可以按以下方式注册:
container.Register(新注入工厂(c=>
新LazyService1Proxy(
新懒汉(
()=>c.解析());
因为我不知道如何在DI注册级别上实现延迟加载,所以我经常使用这种方式来延迟加载服务。我会和你分享我的方法
每个服务接口将继承IService接口,它是所有服务接口的基础
public interface IService
{
// I just want to be sure I'm instantiating ONLY services types.
// This is my base interface
}
public interface IMyService : IService
{
void DoSomeWork();
}
然后,每个服务将实现自己的接口:
public class MyService : IMyService
{
public void DoSomeWork()
{
// Some action performed.
}
}
我的抽象BaseController类实现了这个逻辑
public abstract class BaseController : Controller
{
public T LoadService<T>() where T : IService
{
return (T)System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(T));
}
}
公共抽象类BaseController:控制器
{
公共T LoadService(),其中T:IService
{
return(T)System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(T));
}
}
最后,在继承BaseController的控制器中,我可以这样做:
public class TestController : BaseController
{
// Only parameterless constructor exists created by the compiler.
[HttpPost]
public ActionResult PerformWork()
{
var testService = LoadService<IMyService>();
testService.DoSomeWork();
return View();
}
}
公共类TestController:BaseController
{
//编译器只创建了无参数构造函数。
[HttpPost]
公共行动结果绩效工作()
{
var testService=LoadService();
testService.DoSomeWork();
返回视图();
}
}
我很想看到更好的延迟加载服务实现,或者了解如何使用Unity或Ninject在类型注册级别实现延迟加载。您是否测量了注入未使用依赖项的性能开销,是否确定注入这两个服务实际上是一个瓶颈?是的,我们严重影响了性能,提高性能的关键之一是延迟加载对象。有人能告诉我这个问题的答案吗?你在Service1的构造函数中做什么样的初始化?服务的构造应该很快。Service1或Service2构造很简单,但是控制器依赖于10个或更多的服务,并且并非所有的代码路径都需要所有10个服务,我的问题是如何使用引导Unity或Unity延迟加载服务。MVC 4Steven,首先我要感谢您花费的时间,Service1或Service2构造很简单,但控制器依赖于10个或更多服务,并且并非所有代码路径都需要所有10个服务,我的问题是如何使用引导Unity或Unity延迟加载服务。MVC 4
LoadService
方法充当服务定位器,这是一个。如何在Ninject
中写入最后一个寄存器部分?