zoukankan      html  css  js  c++  java
  • 傻瓜式使用AutoFac

    定义一个接口:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Web;
     5 
     6 namespace AutoFacTest
     7 {
     8     public interface IAddressService
     9     {
    10         string GetAddress(int contactNumber);
    11     }
    12 }

    实现类:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace AutoFacTest
    {
        public class AddressService : IAddressService
        {
            public string GetAddress(int contactNumber)
            {
                string result = string.Empty;
    
                if (contactNumber == 123)
                    result = "上海浦东";
    
                return result;
            }
        }
    }

    先来定义一个容器:

     1 using Autofac;
     2 using Autofac.Core;
     3 using Autofac.Integration.Mvc;
     4 using Autofac.Extras.AggregateService;
     5 using System;
     6 using System.Collections.Generic;
     7 using System.Linq;
     8 using System.Web;
     9 
    10 namespace AutoFacTest.Common
    11 {
    12     public class ObjectContainer
    13     {
    14         public static IContainer Container
    15         {
    16             get
    17             {
    18                 return _container;
    19             }
    20         }
    21 
    22         private static IContainer _container;
    23 
    24         private ObjectContainer()
    25         {
    26         }
    27 
    28         public static void Initialize(Action<ContainerBuilder> action)
    29         {
    30             var builder = new ContainerBuilder();
    31 
    32             if (action != null)
    33             {
    34                 action(builder);
    35             }
    36 
    37             _container = builder.Build();
    38         }
    39 
    40         public static bool IsRegistered<TService>()
    41         {
    42             ThrowIfNotInitialized();
    43             return _container.IsRegistered<TService>();
    44         }
    45 
    46         public static bool IsRegistered(Type serviceType)
    47         {
    48             ThrowIfNotInitialized();
    49             return _container.IsRegistered(serviceType);
    50         }
    51 
    52         public static TService Resolve<TService>(params Parameter[] parameters)
    53         {
    54             ThrowIfNotInitialized();
    55             return _container.Resolve<TService>(parameters);
    56         }
    57 
    58         public static object Resolve(Type serviceType, params Parameter[] parameters)
    59         {
    60             ThrowIfNotInitialized();
    61             return _container.Resolve(serviceType, parameters);
    62         }
    63 
    64         public static TService ResolveNamed<TService>(string serviceName, params Parameter[] parameters)
    65         {
    66             ThrowIfNotInitialized();
    67             return _container.ResolveNamed<TService>(serviceName, parameters);
    68         }
    69 
    70         public static object ResolveNamed(string serviceName, Type serviceType, params Parameter[] parameters)
    71         {
    72             ThrowIfNotInitialized();
    73             return _container.ResolveNamed(serviceName, serviceType, parameters);
    74         }
    75 
    76         public static bool TryResolve<TService>(out TService service)
    77         {
    78             ThrowIfNotInitialized();
    79             return _container.TryResolve<TService>(out service);
    80         }
    81 
    82         public static bool TryResolve(Type serviceType, out object service)
    83         {
    84             ThrowIfNotInitialized();
    85             return _container.TryResolve(serviceType, out service);
    86         }
    87 
    88         private static void ThrowIfNotInitialized()
    89         {
    90             if (_container == null)
    91                 throw new InvalidOperationException("Container should be initialized before using it.");
    92         }
    93     }
    94 }

    Global中注册AddressService和IAddressService的依赖关系,自动将实现类AddressService注入到Ioc容器中。

    using AutoFacTest.Common;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Optimization;
    using System.Web.Routing;
    using System.Web.Security;
    using System.Web.SessionState;
    using Autofac;
    using Autofac.Integration.Mvc;
    using Autofac.Extras.AggregateService;
    
    namespace AutoFacTest
    {
        public class Global : HttpApplication
        {
            private System.ComponentModel.IContainer components = null;
            protected void Application_Start(object sender, EventArgs e)
            {
                // Code that runs on application startup
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                BundleConfig.RegisterBundles(BundleTable.Bundles);
                RegisterDependencies();
            }
    
            private void RegisterDependencies()
            {
                ObjectContainer.Initialize(builder =>
                {
                    builder.RegisterType<AddressService>().As<IAddressService>().InstancePerDependency();
                });
            }
        }
    }

    使用:

    1  IAddressService svc = Common.ObjectContainer.Resolve<IAddressService>();
    2             string address = svc.GetAddress(123);

    再也不用手动new那么多 object。再也不用手写factory,AutoFac就是这么方便。

  • 相关阅读:
    [Castle]Asp.Net中获取Castle容器中的服务的另一方法
    IBatis.Net如何支持多个数据库
    [Castle]Castle.Model被Castle.Core代替了
    [Castle]Castle也范型
    Since NHibernate 1.2.0, objects are lazy by default
    [django]newforms两种方式示例
    [django]the story about Django and TurboGears
    在docker中运行ElasticSearch时报错:docker: invalid reference format: repository name must be lowercase.
    连接Kibana报错:Kibana server is not ready yet
    Win10系统开启虚拟机屏幕蓝屏自动重启
  • 原文地址:https://www.cnblogs.com/kejie/p/6739102.html
Copyright © 2011-2022 走看看