澳门在线威尼斯官方 > 澳门在线威尼斯官方 > 【澳门在线威尼斯官方】Unity容器的简单AOP与DI的

原标题:【澳门在线威尼斯官方】Unity容器的简单AOP与DI的

浏览次数:178 时间:2019-11-10

在那地提姆eProvider调用期内的方法GetCurrentTime方法时就能调用Invoke方法。Invoke方法的参数GetNextHandlerDelegate类的变量在Invoke中的调用代表着真正的调用GetCurrent提姆e方法。其实大家能够如此实现:

public class UnityControllerFactory : DefaultControllerFactory
    {
        public IUnityContainer UnityContainer { get; private set; }

        public UnityControllerFactory()
        {
            /// unity container 的AOP可以完成IOC的功能,在我们使用AOP的时候
            /// 也就完成了依赖项的实例化。
            UnityContainer = new UnityContainer();
            UnityContainer.AddNewExtension<Interception>()
                .RegisterType<IFooRepository, FooRepository>() ///IOC注入实现
                .RegisterType<IBarRepository, BarRepository>() ///IOC注入实现
                .RegisterType<IFooService, FooService>() /// FooService的AOP
                .Configure<Interception>()
                .SetInterceptorFor<IFooService>(new InterfaceInterceptor());

            /// BarSerice的AOP
            UnityContainer.AddNewExtension<Interception>()
                .RegisterType<IBarService, BarSerice>()
                .Configure<Interception>()
                .SetInterceptorFor<IBarService>(new InterfaceInterceptor());
        }

        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
        {
            if (null == controllerType)
            {
                return null;
            }
            return (IController)UnityContainer.Resolve(controllerType);
        }
    }

末段正是使用了:

接下去正是Controller层了,那风流倜傥层调用下后生可畏层瑟维斯s也是依照接口,使用DI构造函数注入达成精通耦。
见百度网盘链接

提出看看微软官方的资料
代码地址:链接: 密码:b9pj

倒车请注解出处:

接下去我们Global.asax中,实现AOP的流入:

接下去我们需求替换调用MVC框架中的暗许调整器工厂,在Global.asax文件中的Application_Start()方法中:
ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory());

View Code

如此就瓜熟蒂落了退换。

前边说过的unity的DI对象 Resolve是在那完结的。

见百度网盘链接

大家定义了二个接口ITimeProvider和接口完毕类DefaultTimeProvider,然后大家按照ICallHandler接口落成一个类:

转载请申明出处:

这种归纳的贯彻是全然能够的。

附带正是Services文件夹里面包车型地铁代码文件:
见百度网盘链接

public class UnityControllerFactory : DefaultControllerFactory
{
    public IUnityContainer UnityContainer { get; private set; }

    public UnityControllerFactory(IUnityContainer unityContainer)
    {
        this.UnityContainer = unityContainer;
    }

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if (null == controllerType)
        {
            return null;
        }
        return (IController)this.UnityContainer.Resolve(controllerType);
    }
}
/// unity container 的AOP可以完成IOC的功能,在我们使用AOP的时候
/// 也就完成了依赖项的实例化。
UnityContainer = new UnityContainer();
UnityContainer.AddNewExtension<Interception>()
.RegisterType<IFooRepository, FooRepository>()
.RegisterType<IBarRepository, BarRepository>()
.RegisterType<IFooService, FooService>() /// FooService的AOP
.Configure<Interception>()
.SetInterceptorFor<IFooService>(new InterfaceInterceptor());


/// BarSerice的AOP
UnityContainer.AddNewExtension<Interception>()
.RegisterType<IBarService, BarSerice>()
.Configure<Interception>()
.SetInterceptorFor<IBarService>(new InterfaceInterceptor());
public class CachingCallHandler : ICallHandler
{
    public int Order { get ; set ; }

    public TimeSpan ExpirationTime { get; private set; }

    public static TimeSpan DefaultExpirationTime { get; private set; }

    public static Func<MethodBase, object[], string> CacheKeyGenerator { get; private set; }

    // 静态构造函数,只调用一次,并且是最先调用的
    static CachingCallHandler()
    {
        DefaultExpirationTime = new TimeSpan(0, 5, 0);
        Guid prefix = Guid.NewGuid();

        CacheKeyGenerator = (method, inputs) =>
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendFormat("{0}: ", prefix);
            sb.AppendFormat("{0}: ", method.DeclaringType);
            sb.AppendFormat("{0}: ", method.Name);

            if (inputs != null)
            {
                foreach (var input in inputs)
                {
                    string hashCode = (input == null) ? "" : input.GetHashCode().ToString();
                    sb.AppendFormat("{0}: ", hashCode);
                }
            }
            return sb.ToString().TrimEnd(':');
        };

    }

    public CachingCallHandler(TimeSpan? expirationTime=null)
    {
        this.ExpirationTime = expirationTime.HasValue ? expirationTime.Value : DefaultExpirationTime;
    }

    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
    {
        MethodInfo targetMethod = (MethodInfo)input.MethodBase;

        if(targetMethod.ReturnType == typeof(void))
        {
            return getNext()(input, getNext);
        }

        object[] inputs = new object[input.Inputs.Count];
        input.Inputs.CopyTo(inputs, 0);
        string cacheKey = CacheKeyGenerator(targetMethod, inputs);

        object[] cachedResult = HttpRuntime.Cache.Get(cacheKey) as object[];

        if (null == cachedResult)
        {
            IMethodReturn realReturn = getNext()(input, getNext);
            if(null == realReturn.Exception)
            {
                HttpRuntime.Cache.Insert(cacheKey, new object[] { realReturn.ReturnValue }, null, DateTime.Now.Add(this.ExpirationTime), Cache.NoSlidingExpiration);
            }
            return realReturn;
        }
        return input.CreateMethodReturn(cachedResult[0], new object[] { input.Arguments });

    }
}

全数Repository相当于三层架构里面包车型地铁DAL数据访谈层,它的成效就是调用数据库,封装了最大旨的增删改查,当然你能够选取ADO.NET或是EntityFramework来做数据库驱动。

澳门在线威尼斯官方 1澳门在线威尼斯官方 2

任何Services文件珍视的意义正是调用下后生可畏层的Repository文件夹的相关类。大家在那正是运用DI中的构造函数注入了,使用接口来兑现解耦,那就需求用到unity容器了。这些档期的顺序是为上大器晚成层的调控器层服务的。

澳门在线威尼斯官方 3澳门在线威尼斯官方 4

率先Repository文件夹里面包车型地铁代码文件:

澳门在线威尼斯官方 5澳门在线威尼斯官方 6

整整德姆o是基于Controller-Service-Repository架构划假造计的,每黄金年代层之间是透过接口来贯彻解耦与调用的,参照了《ASP.NETMVC5框架揭秘》生龙活虎书最终的网址示例架构,使用Unity容器作为DI容器以致贯彻AOP。

View Code

最后正是大家的AOP实现了,对于AOP的落到实处,其实未有怎么好说的,小编在前头的博客里面写过,随后作者会给出链接。

本文由澳门在线威尼斯官方发布于澳门在线威尼斯官方,转载请注明出处:【澳门在线威尼斯官方】Unity容器的简单AOP与DI的

关键词:

上一篇:没有了

下一篇:没有了