问题描述
同一个解决方案下存在不同的项目模块,不同模块之间使用反射时遇到了如下问题:
在统一解决方案HomeWork下存在三个项目模块
项目一命名:HomeWork.DB.Interface
项目二命名:HomeWork.DB.SqlServer
项目三命名:HomeWork
在项目一中我要读取json配置文件
public class DBConfigTool
{
public string GetDBConfig(string key)
{
IConfigurationBuilder builder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
IConfigurationRoot root = builder.Build();
string config = root["DBConfig:" + key];
return config;
}
}
这里就需要用到安装包Microsoft.Extension.Configuration和Microsoft.Extension.Configuration.Josn
我在项目二HomeWork.DB.SqlServer中调用了项目一中的DBConfigTool对象的GetDBConfig方法
在项目二HomeWork.DB.SqlServer中进行数据库操作
public class SqlServerHelper : IDBHelper
{
string connStr = new DBConfigTool().GetDBConfig("SqlServer");
public T Find<T>(int id) where T : BaseModel
{
Type type = typeof(T);
var proplist = type.GetProperties().Select(p => $"[{p.Name}]");
string props = string.Join(',', proplist);
string sql = $"select {props} from [{type.Name}] where Id = {id}";
object oResult = Activator.CreateInstance(type);
using (SqlConnection conn = new SqlConnection(connStr))
{
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);//如果查询不到数据呢?
//正常情况下,应该返回一个null
if (reader.Read())
{
foreach (PropertyInfo prop in type.GetProperties())
{
//DBNull不等于Null
prop.SetValue(oResult, reader[prop.Name] is DBNull ? null : reader[prop.Name]);
}
return oResult as T;
}
else
{
return null;
}
}
}
public List<T> Query<T>() where T : BaseModel
{
Type type = typeof(T);
var proplist = type.GetProperties().Select(p => $"[{p.Name}]");
string propstr = string.Join(',', proplist);
string sql = $"select {propstr} from {type.Name}";
object oResult = Activator.CreateInstance(type);
List<T> list = null;
using (SqlConnection conn = new SqlConnection(connStr))
{
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
if (reader.HasRows)
{
list = new List<T>();
}
while (reader.Read())
{
foreach (PropertyInfo prop in type.GetProperties())
{
prop.SetValue(oResult, reader[prop.Name]);
}
list.Add(oResult as T);
}
conn.Close();
return list;
}
}
}
这里就用到了安装包System.Data.SqlClient
我在项目一HomeWork中通过“反射”,使用项目二HomeWork.DB.SqlServer中的数据库操作方法时出现了一系列的“系统文件找不到”的错误!!!
我的解决方案
使用反射时,我们知道,需要将别的项目下的dll文件、exe文件、pdb文件、json文件复制到当前项目的bin文件夹下,同样的思路,就考虑,是不是也需要将用到的安装包也要放到该文件夹下,所以就把项目一HomeWork.DB.Interface和项目二HomeWork.DB.SqlServer用到的安装包Microsoft.Extension.Configuration和Microsoft.Extension.Configuration.Json和System.Data.SqlClient在项目三中全都安装上,问题就解决了!