其实主要是利用类特性,来存储程序集信息,在利用反射创建实例。与将程序集信息写在配置文件里效果一样。
首先新建特性类,继承Attribute
<pre>
public class DLLInfoAttribute:Attribute
{
public string DllName { get; set; }
public string FullClassName { get; set; }
}
</pre>
我们新建一个接口,抽象业务逻辑。
<pre>
[DLLInfo(DllName = "BLL.dll", FullClassName = "BLL.ClassA")]
public interface IClassA
{
int Add();
}
</pre>
在接口上添加特性信息,DLLName是业务逻辑实例的dll文件名称,FullClassName是命名空间+类名。
然后我们新增业务逻辑类,继承接口IClassA
<pre>
namespace BLL
{
public class ClassA:IClassA
{
public int Add()
{
return 0;
}
}
}
</pre>
UI层引用IClass接口项目,DllInfo特性类项目。
调用方法如下
<pre>
private void button_Click(object sender, EventArgs e)
{
IClassA ca = (IClassA)CreateInstance(typeof(IClassA), typeof(DLLInfoAttribute));
ca.Add();
}
private object CreateInstance(Type t, Type attri)
{
object[] obj = t.GetCustomAttributes(attri, true);
DLLInfoAttribute dllInfoC = (DLLInfoAttribute)obj[0];
System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom(Application.StartupPath + "\\" + dllInfoC.DllName);
return assembly.CreateInstance(dllInfoC.FullClassName);
}
</pre>
这样,实现了UI层与业务逻辑层解耦。