tnblog
首页

c#使用unity实现依赖注入三:unity常用生命周期

208人阅读 2019/1/22 16:49 评论:0 收藏
分类: .NET


常用的生命周期有瞬时模式,单利模式,每个线程一个对象模式等。



一:TransientLifetimeManager


TransientLifetimeManager模式就是单利模式,是RegisterType注入方式的默认方式

  uc.RegisterType<IUserDAL, UserTwoDAL>(new TransientLifetimeManager());

可以通过hashcode值来看看是否是同一个对象

 public ActionResult Index()
        {
            //获取到容器
            IUnityContainer iuc = MyUnityContainer.GetContainer();
            IUserDAL iud = iuc.Resolve<IUserDAL>();
            IUserDAL iud2 = iuc.Resolve<IUserDAL>();
            //从容器拿到需要的对象
            ViewBag.obj1 = iud.GetHashCode();
            ViewBag.obj2 = iud2.GetHashCode();

            return View();
        }
<div>
    @ViewBag.obj1
</div>
<div>
    @ViewBag.obj2
</div>

可以看到每次输出的hashcode值都不一样说明是瞬时模式



二:TransientLifetimeManager

ContainerControlledLifetimeManager单利模式

容器控制生命周期管理,这个生命周期管理器是RegisterInstance默认使用的生命周期管理器,也就是单件实例,UnityContainer会维护一个对象实例的强引用,每次调用的时候都会返回同一对象.

 uc.RegisterType<IUserDAL, UserTwoDAL>(new ContainerControlledLifetimeManager());

可以看到每次输出的hashcode值都一样说明是单利模式



三:HierarchicalLifetimeManager


分层生命周期管理器,这个管理器类似于ContainerControlledLifetimeManager,也是由UnityContainer来管理,也就是单件实例。不过与ContainerControlledLifetimeManager不 同的是,这个生命周期管理器是分层的,因为Unity的容器时可以嵌套的,所以这个生命周期管理器就是针对这种情况,当使用了这种生命周期管理器,父容器 和子容器所维护的对象的生命周期是由各自的容器来管理


四:PerResolveLifetimeManager

这个生命周期是为了解决循环引用而重复引用的生命周期,先看一下微软官方给出的实例:

public interface IPresenter
{ }
 
public class MockPresenter : IPresenter
{
    public IView View { get; set; }
 
    public MockPresenter(IView view)
    {
        View = view;
    }
}
 
public interface IView
{
    IPresenter Presenter { get; set; }
}
 
public class View : IView
{
    [Dependency]
    public IPresenter Presenter { get; set; }
}

从这个例子中可以看出,有2个接口IPresenter和IView,还有2个类MockPresenter和View分别实现这2个接口,同时这2个类 中都包含了对另外一个类的对象属性,这个就是一个循环引用,而对应的这个生命周期管理就是针对这种情况而新增的,其类似于 TransientLifetimeManager,但是其不同在于,如果应用了这种生命周期管理器,则在第一调用的时候会创建一个新的对象,而再次通过 循环引用访问到的时候就会返回先前创建的对象实例(单件实例)


五:PerThreadLifetimeManager

每线程生命周期管理器,就是保证每个线程返回同一实例。





请先登录

{{item.title}}

{{item.content}}
不能简单的解决问题,那是设计与做法有问题
博主搜索
文章类别
CSS 5篇
云服务 2篇
Git 4篇
.NET 29篇
Android 0篇
软件架构 4篇
.NET Core 15篇
.NET MVC 3篇
英语 3篇
随笔 3篇
Bootstrap 1篇
Redis 12篇
编辑器 2篇
Js相关 6篇
Layui 2篇
Oracle 7篇
Python 2篇
数据库 2篇
EF 2篇
微信 2篇
前端 1篇
消息队列 1篇
最新文章
为什么要使用webapi而不直接使用controller
net core发布到IIS常见错误
net core依赖注入
NET CORE配置EF连接字符串
Net Core使用依赖注入来装载EF的上下文对象
下载net core
Sqlerver添加用户与授权
net core中使用url编码与解码操作
net core启动报错Unable to configure HTTPS endpoint. No server certificate was specified
.net core使用response
ef6动态添加条件
最新评价
{{item.ArticleTitle}}
{{item.BlogName}} : {{item.Content}}