2 pm1423258028 pm1423258028 于 2017.03.20 11:25 提问

2000C币高额悬赏!在框架分层的情况下成功使用AutoFac控制反转! 2000C

跪求解决方案!
我的框架是MVC模式的.NET框架,
包含框架核心层,分数据服务接口层、数据服务层、业务处理接口层、业务处理层,表现层
表现层引用业务处理接口层,
业务处理层引用数据服务接口层、业务处理接口层,
数据服务层引用数据服务接口层,框架核心层的仓储接口
然后在表现层的Global.asax文件中的Application_Start方法中调用如下代码进行依赖注入
但是无法获取到数据服务层、及业务处理层的实例
求解决!
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(asm);
//注册服务
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(dllName);
var list = new List();
foreach (string filename in pluginpath)
{
try
{
string asmname = Path.GetFileNameWithoutExtension(filename);
if (asmname != string.Empty)
{
Assembly asm = Assembly.LoadFrom(filename);
list.Add(asm);
}
}
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
}
}

6个回答

u013929331
u013929331   2017.03.20 12:28

写的不够明确啊,如何到不了数据服务层、及业务处理层的实例

pm1423258028
pm1423258028 回复爱看夜的猫: 好的,pm1423258028@163.com
大约一年之前 回复
u013929331
u013929331 回复爱看夜的猫: C币无所谓
大约一年之前 回复
u013929331
u013929331 回复pm1423258028: 我有类似项目,使用 Assembly做预加载,邮箱留一下
大约一年之前 回复
pm1423258028
pm1423258028 Assembly[] asmBusiness = GetAllAssembly("MicroCloud.Business.dll").ToArray(); asmBusiness 的个数为0
大约一年之前 回复
u013728160
u013728160   2017.03.20 17:32

1.下载DataBase.cs
2.下载Utils.cs
3. 配置数据库连接字符



4. 自己参悟一下
public static List ToList(DataTable dt)

{
List list = new List();
foreach (DataRow dr in dt.Rows)
{
dynamic entity = new ExpandoObject();
var dic = (Dictionary)entity;
foreach (DataColumn dc in dt.Columns)
{
dic.Add(name,value);
}
list.Add(entity);
}
return list;
}

出来的格式是把每条数据变成实体格式数据,实体类省了,生成实体类的代码生成工具都不用了
当然还有更牛叉的。
liaoyu45
liaoyu45 我们的代码几乎一模一样……直接用IDictionary<string, object>声明呗?加上个泛型好么?good good
4 个月之前 回复
joyPoyerter
joyPoyerter   2017.03.20 13:06

的确不够明确。给我2000C 我给你解决

caozhy
caozhy 回复王九思易: 两个人一个想用C币骗答案,一个想用答案骗C币,哈哈,结果是C币也死在这里了,问题也没人解决。
4 个月之前 回复
pm1423258028
pm1423258028 只要能解决,这都不是事儿
大约一年之前 回复
u013728160
u013728160   2017.03.20 17:13

扔了吧,给你个新框架,什么springmvc之类,其实都是坑人的,一堆垃圾代码,根本没自己写的好用。

u013929331
u013929331   2017.03.20 22:48

要按照实际项目选择,不能死搬硬套

yunwu009
yunwu009   2017.09.11 10:52

检查一下BLL,DAL接口,检查DLL路径命名空间,其实这东西还不如自己写来得实际

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!