快捷搜索:

控制服务-在框架分层的情况下使用AutoFac控制反转

日期:2019-10-05编辑作者:美术

我在APP_Start文件夹中新建了一个类命名为AutoFacConfig

但是无法获取到数据服务层、及业务处理层的实例

求解决!
using Autofac;
using Autofac.Integration.Mvc;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Mvc;

namespace MicroCloud.Admin
{
public class AutoFacConfig
{
public static void RegisterAutoFac()
{
var builder = new ContainerBuilder();
//加载层的控制器,否则无法在其他层控制器构造注入,只能在web层注入
Assembly[] asm = GetAllAssembly("MicroCloud.Admin.dll").ToArray();
builder.RegisterAssemblyTypes;
//注册服务
Assembly[] asmServices = GetAllAssembly("MicroCloud.DataServices.dll").ToArray

();
builder.RegisterAssemblyTypes(asmServices)
.Where(t => t.Name.EndsWith("Service")&&t.Name!= "BaseService" && t.Name !=

"BaseTableService")
.AsImplementedInterfaces();
//注册业务
Assembly[] asmBusiness = GetAllAssembly("MicroCloud.Business.dll").ToArray();
builder.RegisterAssemblyTypes(asmBusiness)
.Where(t => t.Name.EndsWith("Business"))
.AsImplementedInterfaces();
builder.RegisterControllers(Assembly.GetExecutingAssembly;
builder.RegisterModelBinders(Assembly.GetExecutingAssembly;
builder.RegisterModelBinderProvider();
//注册过滤器
//builder.RegisterFilterProvider();
//builder.RegisterType().PropertiesAutowired();
builder.RegisterControllers(typeof(MvcApplication).Assembly);
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
#region 加载程序集
public static List GetAllAssembly(string dllName)
{
List pluginpath = FindPlugin;
var list = new List();
foreach (string filename in pluginpath)
{
try
{
string asmname = Path.GetFileNameWithoutExtension;
if (asmname != string.Empty)
{
Assembly asm = Assembly.LoadFrom;
list.Add;
}
}
catch (Exception ex)
{
Console.Write(ex.Message);
}
}
return list;
}
//查找所有插件的路径
private static List FindPlugin(string dllName)
{
List pluginpath = new List();

 string path = AppDomain.CurrentDomain.BaseDirectory; string dir = Path.Combine(path, "bin"); string[] dllList = Directory.GetFiles(dir, dllName); if (dllList.Length > 0) { pluginpath.AddRange(dllList.Select(item => Path.Combine(dir, 

item.Substring(dir.Length + 1))));
}
return pluginpath;
}
#endregion
}
}

AutoFac在MVC的使用

在框架分层的情况下使用AutoFac控制反转 100C
跪求解决方案!
我的框架是MVC模式的.NET框架,
包含框架核心层,分数据服务接口层、数据服务层、业务处理接口层、业务处理层,表现层
表现层引用业务处理接口层,
业务处理层引用数据服务接口层、业务处理接口层,
数据服务层引用数据服务接口层,框架核心层的仓储接口
然后在表现层的Global.asax文件中的Application_Start方法中调用如下代码进行依赖注入

            //注册程序中所有的类到其实现接口
            Assembly repositoryAss = Assembly.Load("Study.CRM.Repository");
            bulider.RegisterTypes(repositoryAss.GetTypes()).AsImplementedInterfaces();

注意:在项目中AutoFac的注入有两次,第一次是将数据访问层的类注入到业务逻辑层。第二次是将业务逻辑层的类注入到UI层。

            #region 2.0 仓储的注册
            //2.0 利用bulider对象开始创建仓储的实现类与对应的仓储接口的对应关系
            //注意:如果加了InstancePerHttpRequest() 每次都是的新的实体进行注入操作

public static void Register()

            #endregion

            //利用AutoFac实现项目的IOC和DI
            AutoFacConfig.Register();
        }
    }

}

            //4.0 告诉MVC框架将来所有控制器的对象的创建工作交给autofac.dll中的控制器工厂来完成
            //特点:会利用控制器中的有参数构造函数创建其对象,同时在创建的过程中,会根据构造函数中的
            //接口参数,将此接口的具体实现类的对象注入
            //4.0.1  根据已经注册好的组建创建此容器对象中所有的映射关系的具体实现
            var container = bulider.Build();
            // 4.0.2 将MVC的控制器对象实例 交由autofac来创建
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

{

依赖注入(控制反转)
常见的依赖注入工具:AutoFac,Spring.Net,Unity等
依赖注入的方式:1.通过构造函数进行注入2.通过属性进行注入

            #region 3.0 业务逻辑层的注册
            //3.0 利用bulider对象开始创建业务逻辑实现类与对应的业务逻辑接口的对象关系
            //单个注册业务逻辑类到其对应的接口
            //bulider.RegisterType(typeof(sysFunctionServices)).As(typeof(IsysFunctionServices)).InstancePerHttpRequest();

            //注册单个仓储来到其对应的接口
            //bulider.RegisterType(typeof(sysFunctionRepository)).As(typeof(IsysFunctionRepository)).InstancePerHttpRequest();

定义一个静态的无返回的方法

  

            //注册业务逻辑程序中的所有类到其实现的接口(AsImplementedInterfaces() 此方法:就是用来自动转成接口的)
            Assembly servicesAss = Assembly.Load("Study.CRM.Services");
            bulider.RegisterTypes(servicesAss.GetTypes()).AsImplementedInterfaces();

在global文件中进行注册

            #endregion

 public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            //注册区域路由规则
            AreaRegistration.RegisterAllAreas();
            //注册全局过滤器
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            //注册网站路由
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            //优化js,css文件
            BundleConfig.RegisterBundles(BundleTable.Bundles);

//1.0 创建一个autofac的容器对象
            var bulider = new ContainerBuilder();
            //1.0.1 获取程序集载入到Assembly对象中
            Assembly controllerDll = Assembly.Load("Study.CRM.Site");
            //1.0.1 告诉autofac对象将来实例化的控制器所存在的程序集是Study.CRM.Site.dll
            bulider.RegisterControllers(controllerDll);

 

            //注册当前程序中类型名称的前缀为sysFunction 的所对应类的实例
            //bulider.RegisterTypes(servicesAss.GetTypes().Where(c => c.Name.StartsWith("sysFunction")).ToArray()).AsImplementedInterfaces();

 

本文由402com永利官方手机登录注册发布于美术,转载请注明出处:控制服务-在框架分层的情况下使用AutoFac控制反转

关键词:

WOW64最佳实现

我们已经知道: 1. 共享 保存可以被32位和64位共同使用的注册表。 当我们安装新程序或 Windows x64版的计算机上运行程...

详细>>

WOW64最佳实现

我们已经知道: 1. 共享 保存可以被32位和64位共同使用的注册表。 当我们安装新程序或 Windows x64版的计算机上运行程...

详细>>

二胎时代,更要加倍爱大宝

短短几个月时间,不管是官方平台还是一些门户网站,放眼铺天盖地皆是鼓励二胎的文章、资讯,二胎似乎成了一件...

详细>>

找图标素材?这些网站够你用了(推荐)

LogoEPS 不知道你有没有遇到过这样的情况,时常在文稿中需要使用一些品牌案例的时候,却发现自己没有这些品牌的...

详细>>