zoukankan      html  css  js  c++  java
  • 一个简单的模板系统的实现(动态载入DLL)

    目的:为WEB程序做一套模板系统,每个模板是一个dll,在不影响主程序的情况下,动态加载模板。

    假设我们有一个类叫TUser,保存了用户的信息,很简单,只有username和email两个字段

    /***************************************************************
    ** /user.cs
    ** 编译参数 csc /t:library /out:bin/user.dll user.cs
    **************************************************************
    */
    namespace demo
    {
        
    public class TUser
        {
            
    public string UserName = "";
            
    public string Email = "";
            
    public TUser(string userName, string email)
            {
                
    this.UserName = userName;
                
    this.Email = email;
            }
        }
    }

    下面是我们的模板的接口 ITemplate,只有一个 Print 方法

    /***************************************************************
    ** /ITemplate.cs
    ** 编译参数 csc /r:user.dll /t:library /out:bin/ITemplate.dll ITemplate.cs
    **************************************************************
    */
    namespace demo
    {
        
    public interface ITemplate
        {
            
    void Print(TUser u);
        }
    }


    下面是一个其中一个模板的实现,名字叫 table

    /***************************************************************
    ** /template/table.cs
    ** 编译参数 csc /r:..\bin\user.dll,..\bin\ITemplate.dll /t:library /out:bin/dll/table.dll table.cs
    **************************************************************
    */
    namespace demo
    {
        
    public class Template : ITemplate
        {
            
    public void Print(TUser u)
            {
                System.Console.WriteLine(
    "<template:table>");
                System.Console.WriteLine(
    "<username>{0}</username>\n", u.UserName);
                System.Console.WriteLine(
    "<email>{0}</email>\n", u.Email);
                System.Console.WriteLine(
    "</template:table>");
            }
        }
    }

    下面是主程序

    /***************************************************************
    ** /program.cs
    ** 编译参数 csc /r:bin/user.dll,bin/ITemplate.dll /out:bin/program.exe program.cs
    **************************************************************
    */
    using System;
    using System.Reflection;
    using System.Configuration;

    namespace demo
    {
        
    public class Program
        {
            
    static void Main()
            {
                
    string dll = ConfigurationManager.AppSettings["template"];
                
    string className = ConfigurationManager.AppSettings["className"];

                TUser u 
    = new TUser("ifan""ifan@cnblogs.com");

                Assembly ass 
    = Assembly.LoadFrom(dll);
                Type t 
    = ass.GetType(className);
                ITemplate o 
    = (ITemplate)Activator.CreateInstance(t);
                o.Print(u);
            }
        }
    }

    我们把要载入的模板信息放在配置文件里面

    <!--
    program.exe.config
    -->
    <?xml version="1.0"?>
    <configuration>
        
    <appSettings>
            
    <add key="template" value="dll/table.dll"/>
            
    <add key="className" value="demo.Template"/>
        
    </appSettings>
    </configuration>


    编译后的路径结构是

    /bin/program.exe
    /bin/program.exe.config
    /bin/ITemplate.dll
    /bin/user.dll
    /bin/dll/table.dll


     运行 program.exe 就能看到结果了:

    <template:table>
    <username>ifan</username>
    <email>ifan@cnblogs.com</email>
    </template:table>

    现在我们再写一个模板,名字叫list:

    /***************************************************************
    ** /template/list.cs
    ** 编译参数 csc /r:..\bin\user.dll,..\bin\ITemplate.dll /t:library /out:bin/dll/list.dll list.cs
    **************************************************************
    */
    namespace demo
    {
        
    public class Template : ITemplate
        {
            
    public void Print(TUser u)
            {
                System.Console.WriteLine(
    "<template:list>");
                System.Console.WriteLine(
    "<username>{0}</username>\n", u.UserName);
                System.Console.WriteLine(
    "<email>{0}</email>\n", u.Email);
                System.Console.WriteLine(
    "</template:list>");
            }
        }
    }
    编译后将配置文件中的 template 的 value 改成 dll/list.dll,重新运行 program,能看到不一样的结果:
    <template:list>
    <username>ifan</username>
    <email>ifan@cnblogs.com</email>
    </template:list>
  • 相关阅读:
    如何使用 vimdiff 来 git diff /svn diff
    nginx https ssl 设置受信任证书[原创]
    Nginx配置proxy_pass转发的/路径问题
    116、Android获取Manifest中<meta-data>元素的值
    Android Studio系列教程四--Gradle基础(转载)
    Android Studio系列教程六--Gradle多渠道打包(转载)
    1、Android Studio集成极光推送(Jpush) 报错 java.lang.UnsatisfiedLinkError: cn.jpush.android.service.PushProtoco
    Java数组转成list,list转数组
    115、定时器(TimerTask+Timer+Handler)
    114、Android禁止ViewPager的左右滑动
  • 原文地址:https://www.cnblogs.com/ifan/p/1358710.html
Copyright © 2011-2022 走看看