个人项目框架搭建 -- Autofac简单使用记录

1、添加autofac相关程序集/使用Nuget

2、引入命名空间

using Autofac;
using Autofac.Configuration;

3、使用

3.1:直接使用

var build = new ContainerBuilder();
build.RegisterType<MemoryCacheManager>(); build.Register
<ICacheManager>(c => new MemoryCacheManager()).InstancePerLifetimeScope();

//builder.RegisterType<FileLogger>();
//builder.RegisterType<FileLogger>().As<ILogger>();

using (var container = build.Build())
{
    ICacheManager cache = container.Resolve<ICacheManager>();
    //使用
}

3.2:配置文件使用

//1.在配置文件中配置如下代码 依瓢画葫芦即可

EnterpriseFrame.IService 接口类库
EnterpriseFrame.IService.IAdminService 要注册的接口
EnterpriseFrame.Service 实现接口的命名空间
EnterpriseFrame.Service.AdminService 实现的接口
<configuration>
  <configSections>
    <section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/>
  </configSections>
  <autofac defaultAssembly="EnterpriseFrame.IService">
    <components>
      <component type="EnterpriseFrame.Service.AdminService, EnterpriseFrame.Service" service="EnterpriseFrame.IService.IAdminService" />
    </components>
  </autofac>
</configuration>
//2.使用
var
build = new ContainerBuilder(); build.RegisterModule(new ConfigurationSettingsReader("autofac")); using (var container = build.Build()) { var service = container.Resolve<IAdminService>(); var result = service.CheckAdminPwd("admin", "123456"); Assert.IsTrue(result); }

3.3在mvc的controller使用构造函数的方式注册

//在Application_Start()中调用
var builder = new ContainerBuilder();
AutofacRegisterController(builder);//注册Controller的构造函数
AutofacRegisterService(builder);//注册使用到的服务
private void AutofacRegisterController(ContainerBuilder builder)
{
    var baseType = typeof(IDependency);
    //var assemblys = AppDomain.CurrentDomain.GetAssemblies().ToList();
    var assemblys = System.Web.Compilation.BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToList();
    var AllServices = assemblys
        .SelectMany(s => s.GetTypes())
        .Where(p => baseType.IsAssignableFrom(p) && p != baseType);

    builder.RegisterControllers(assemblys.ToArray());

    builder.RegisterAssemblyTypes(assemblys.ToArray())
            .Where(t => baseType.IsAssignableFrom(t) && t != baseType)
            .AsImplementedInterfaces().InstancePerLifetimeScope();
}

private void AutofacRegisterService(ContainerBuilder builder)
{
  builder.RegisterGeneric(typeof(EfRepository<>)).As(typeof(IRepository<>)).InstancePerLifetimeScope();
  builder.Register<IDbContext>(c => new EnterpriseContext("name=EnterpriseCon")).InstancePerLifetimeScope();//连接字符串
  builder.Register<ILogger>(c => new MyLogger(HttpContext.Current.Server.MapPath(""))).InstancePerLifetimeScope();//注册日志 保存至根目录
  builder.Register<ICacheManager>(c => new MemoryCacheManager()).InstancePerLifetimeScope();//注册缓存

}

控制器代码:

public class TestController : Controller
{
    private ILogger _logger;
    private ICacheManager _cacheManager;
    public TestController(ILogger logger,ICacheManager cache)
    {
        _logger = logger;
        _cacheManager = cache;
    }
    private static string TEST_CACHE_KEY = "TEST_CACHE_KEY";
    public ActionResult Caching()
    {

        string time = _cacheManager.Get<string>(TEST_CACHE_KEY, 1, () => { return DateTime.Now.ToString(); });
        return Content(time);
    }
}

 Global.asax Application_Start方法中可以这样写:

            //方式二
            //var builder = new ContainerBuilder();
            //builder.RegisterType<FileLogger>();
            //builder.Register<ILogger>(c => new FileLogger()).InstancePerLifetimeScope();

            //var assembly = Assembly.GetExecutingAssembly();
            //builder.RegisterControllers(assembly).PropertiesAutowired();//PropertiesAutowired();属性注入
            //var container = builder.Build();
            //DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

 

文中若有错误和不足之处,还望路过的道友指出。

posted @ 2016-04-09 14:28  易墨  阅读(937)  评论(0编辑  收藏  举报
Fork me on GitHub