繁体   English   中英

如何从ASP.NET MVC网站中生成可下载的c#类?

[英]How can I generate a downloadable c# class from within an ASP.NET MVC website?

我确信这是一个非常奇怪的要求,但是这里有。

我们有一些客户配置代码,由我们编译成类库的C#类表示。 创建这些配置类目前是我想要分配给开发人员以外的人的猴子工作。 因此,我们正在构建一个“Configurator”网站,业务分析师可以通过填写包含所选相关选项的表单来生成有效的C#类。

从MVC网站中的模板生成C#类的最佳方法是什么? 请注意,我不是在谈论动态生成在运行时执行类:我们实际上生成的文本文件恰好包含将包含在完全不同的项目中的C#代码。

这被证明是谷歌正确的一个非常困难的话题! 到目前为止出现的选项......

  • 只需使用标记化的文本文件并使用String.Format替换值
  • 以某种方式使用Razor作为模板引擎(但不确定如何,它不是我们正在生成的HTML)
  • 不知何故使用T4模板(至少我知道它用于生成C#,但不确定如何在运行时执行)

关于如何最好地接近这个的任何想法?

根据要求,这是输出类/文件的示例。 此处的值覆盖基类中设置的值,具有客户特定的标签,验证等。这就是我们为客户定制产品的方式。

public class AreaRiskTemplate: AreaRiskTemplateBase
{
    public override string EntityName { get { return "risk"; } }
    public override string EntityNamePlural { get { return "risks"; } }
    public override string EntityNameArticle { get { return "a"; } }
    public override string CGovItemRefPrefix { get { return "R"; } }
    public override void SetFieldDefinitions()
    {

        FieldDefinitions.Level1.IsImplemented = true;
        FieldDefinitions.Level1.Label = "Category";
        FieldDefinitions.Level1.IsVisibleInGrid = true;

        FieldDefinitions.Level2.IsImplemented = true;
        FieldDefinitions.Level2.Label = "Team";
        FieldDefinitions.Level2.IsVisibleInGrid = true;

        FieldDefinitions.Description.IsImplemented = true;
        FieldDefinitions.Description.Label = "Description";
        FieldDefinitions.Description.IsVisibleInGrid = true;

    }
    public override ModelStateDictionary Validate()
    {
        var msd = new ModelStateDictionary();
        // add template-specific validation here
        msd.Merge(base.Validate());
        return msd;
    }
    public override List<string> Level1Options
    {
        get
        {
            return new List<string>
                {
                    "Organisational",
                    "Financial",
                    "Operational",
                    "External",
            "IT"
                };
        }
    }
}

更新:目前正在http://msdn.microsoft.com/en-us/library/ee844259(v=vs.100).aspx上调查T4模板(感谢下面的评论)。 看起来很有希

我建议避开网站,而只是简单地使用CodeSmith。 您可以设计CodeSmith脚本,以便它会询问信息,然后生成所需的代码。 虽然你必须购买CodeSmith,但似乎工作量少得多。

以最少的开销执行此操作的方法是使用Microsoft内置的CodeDOM API 它允许您使用跨语言兼容的文档对象模型构建和操作CLR代码文档。

这种方法的唯一缺点是如何实现一些特定于语言的功能并不是显而易见的。 一个例子是C# readonly字段,因为它们不是在每种CLR语言中都可用,而是仅在C#中可用。 这种特殊复杂性的解决方案是使用CodeSnippet并将手动代码作为字符串插入。 通过将CodeDOM与模板引擎集成,可以减轻其他更复杂的不匹配问题。 Oleg Sych写了一篇关于将CodeDOM与T4模板引擎集成的有用文章 我更喜欢这种纯文本生成方法的方法,因为强类型文档对象模型比纯文本更不容易出错。

此外,如果你曾经想要编译输出代码,CodeDOM API也支持这一点。

如果这是您认为可能会使用很多的实践,则可能需要使用构建器模式将一些常见的DOM操作功能包装到流畅的方法调用中。 我已经构建了一个使用这种方法的个人库,它通过代码生成非常成功地提高了我的工作效率。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM