Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
performance
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zry
performance
Commits
5db6df9a
Commit
5db6df9a
authored
Mar 26, 2019
by
ruyun.zhang@suvalue.com
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
t4模板生成
parent
5efc9724
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
870 additions
and
0 deletions
+870
-0
performance/Performance.EntityModels/Performance.EntityModels.csproj
+24
-0
performance/Performance.EntityModels/T4/AutoContext.cs
+19
-0
performance/Performance.EntityModels/T4/AutoContext.tt
+48
-0
performance/Performance.EntityModels/T4/AutoEntity.cs
+19
-0
performance/Performance.EntityModels/T4/AutoEntity.tt
+67
-0
performance/Performance.EntityModels/T4/EntityHelper.ttinclude
+170
-0
performance/Performance.EntityModels/T4/T4Manager.ttinclude
+142
-0
performance/Performance.Repository/T4/AutoRepository.cs
+19
-0
performance/Performance.Repository/T4/AutoRepository.tt
+50
-0
performance/Performance.Repository/T4/EntityHelper.ttinclude
+170
-0
performance/Performance.Repository/T4/T4Manager.ttinclude
+142
-0
No files found.
performance/Performance.EntityModels/Performance.EntityModels.csproj
View file @
5db6df9a
...
...
@@ -41,4 +41,28 @@
<Service Include="{508349b6-6b84-4df5-91f0-309beebad82d}" />
</ItemGroup>
<ItemGroup>
<Compile Update="T4\AutoEntity.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>AutoEntity.tt</DependentUpon>
</Compile>
<Compile Update="T4\AutoRepository.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>AutoRepository.tt</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<None Update="T4\AutoEntity.tt">
<Generator>TextTemplatingFileGenerator</Generator>
<LastGenOutput>AutoEntity.cs</LastGenOutput>
</None>
<None Update="T4\AutoRepository.tt">
<Generator>TextTemplatingFileGenerator</Generator>
<LastGenOutput>AutoRepository.cs</LastGenOutput>
</None>
</ItemGroup>
</Project>
performance/Performance.EntityModels/T4/AutoContext.cs
0 → 100644
View file @
5db6df9a
performance/Performance.EntityModels/T4/AutoContext.tt
0 → 100644
View file @
5db6df9a
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ include file=".\EntityHelper.ttinclude" #>
<#@ include file=".\T4Manager.ttinclude" #>
<#
// 数据库连接
var connectionString = @"server=192.168.18.166;database=db_performance;uid=root;pwd=1234qwer;port=3306;";
// 需要解析的数据库
var database = new List<string> { "db_performance" };
DirectoryInfo directory = new DirectoryInfo(Host.TemplateFile);
var outputPath = Path.Combine(directory.Parent.Parent.FullName,"Context");
new DirectoryInfo(outputPath).Create();
var manager = new Manager(Host, GenerationEnvironment, true) { OutputPath = outputPath };
var entities = EntityHelper.GetEntities(connectionString, database);
manager.StartBlock("PerformanceDbContext.cs");
#>
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
using System;
namespace Performance.EntityModels
{
public partial class PerformanceDbContext : DbContext
{
public PerformanceDbContext(DbContextOptions<PerformanceDbContext> options)
: base(options)
{
}
<#
foreach(Entity entity in entities)
{
#>
/// <summary> <#= entity.EntityComment #> <summary>
public virtual DbSet<<#= entity.EntityName #>> <#= entity.EntityName #> { get; set; }
<#
}
#>
}
}
<#
manager.EndBlock();
manager.Process(true);
#>
performance/Performance.EntityModels/T4/AutoEntity.cs
0 → 100644
View file @
5db6df9a
performance/Performance.EntityModels/T4/AutoEntity.tt
0 → 100644
View file @
5db6df9a
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ include file=".\EntityHelper.ttinclude" #>
<#@ include file=".\T4Manager.ttinclude" #>
<#
// 数据库连接
var connectionString = @"server=192.168.18.166;database=db_performance;uid=root;pwd=1234qwer;port=3306;";
// 需要解析的数据库
var database = new List<string> { "db_performance" };
DirectoryInfo directory = new DirectoryInfo(Host.TemplateFile);
var outputPath = Path.Combine(directory.Parent.Parent.FullName,"entity");
new DirectoryInfo(outputPath).Create();
var manager = new Manager(Host, GenerationEnvironment, true) { OutputPath = outputPath };
var entities = EntityHelper.GetEntities(connectionString, database);
foreach(Entity entity in entities)
{
manager.StartBlock(entity.EntityName + ".cs");
#>
//-----------------------------------------------------------------------
// <copyright file=" <#= entity.EntityName #>.cs">
// * FileName: <#= entity.EntityComment #>.cs
// * history : <#= DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") #>
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Performance.EntityModels
{
/// <summary>
/// <#= entity.EntityComment #>
/// </summary>
[Table("<#= entity.EntityName #>")]
public class <#= entity.EntityName #>
{
<#
for(int i = 0; i < entity.Fields.Count; i++)
{
if(entity.Fields[i].Key == "PRI"){
#> /// <summary>
/// <#= entity.Fields[i].Comment #>
/// </summary>
[Key]
public <#= entity.Fields[i].Type #> <#= entity.Fields[i].Name #> { get; set; }
<#
}
else{
#>
/// <summary>
/// <#= entity.Fields[i].Comment #>
/// </summary>
public <#= entity.Fields[i].Type #> <#= entity.Fields[i].Name #> { get; set; }
<# }
}
#>
}
}
<#
manager.EndBlock();
}
manager.Process(true);
#>
performance/Performance.EntityModels/T4/EntityHelper.ttinclude
0 → 100644
View file @
5db6df9a
<#@ assembly name="System.Core"#>
<#@ assembly name="System.Data"#>
<#@ assembly name="$(ProjectDir)\T4\PublicDll\MySql.Data.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="MySql.Data.MySqlClient" #>
<#+
public class EntityHelper
{
public static List<Entity> GetEntities(string connectionString, List<string> databases)
{
var list = new List<Entity>();
var conn = new MySqlConnection(connectionString);
try
{
conn.Open();
var dbs = string.Join("','", databases.ToArray());
var cmd = string.Format(@"SELECT `information_schema`.`COLUMNS`.`TABLE_SCHEMA`
,`information_schema`.`TABLES`.`TABLE_NAME`
,`information_schema`.`TABLES`.`TABLE_COMMENT`
,`information_schema`.`COLUMNS`.`COLUMN_NAME`
,`information_schema`.`COLUMNS`.`DATA_TYPE`
,`information_schema`.`COLUMNS`.`COLUMN_COMMENT`
,`information_schema`.`COLUMNS`.`IS_NULLABLE`
,`information_schema`.`COLUMNS`.`COLUMN_KEY`
FROM `information_schema`.`TABLES`
LEFT JOIN `information_schema`.`COLUMNS`
ON `information_schema`.`TABLES`.`TABLE_NAME`=`information_schema`.`COLUMNS`.`TABLE_NAME`
WHERE `information_schema`.`COLUMNS`.`TABLE_SCHEMA` IN ('{0}') ", dbs);
using (var reader = MySqlHelper.ExecuteReader(conn, cmd))
{
while (reader.Read())
{
var db = reader["TABLE_SCHEMA"].ToString();
var tabcomment = reader["TABLE_COMMENT"].ToString();
var table = reader["TABLE_NAME"].ToString();
var column = reader["COLUMN_NAME"].ToString();
var type = reader["DATA_TYPE"].ToString();
var comment = reader["COLUMN_COMMENT"].ToString();
var nullable = reader["IS_NULLABLE"].ToString();
var key = reader["COLUMN_KEY"].ToString();
var entity = list.FirstOrDefault(x => x.EntityName == table);
if(entity == null)
{
entity = new Entity(table,tabcomment);
entity.Fields.Add(new Field
{
Name = column,
Type =GetIsNullable( GetCLRType(type),nullable),
Comment = comment,
Key = key
});
list.Add(entity);
}
else
{
entity.Fields.Add(new Field
{
Name = column,
Type = GetIsNullable( GetCLRType(type),nullable),
Comment = comment,
Key = key
});
}
}
}
}
finally
{
conn.Close();
}
return list;
}
public static string GetCLRType(string dbType)
{
switch(dbType)
{
case "tinyint":
case "smallint":
case "mediumint":
case "int":
case "integer":
return "int";
case "double":
return "double";
case "float":
return "float";
case "decimal":
return "decimal";
case "numeric":
case "real":
return "decimal";
case "bit":
return "bool";
case "date":
case "time":
case "year":
case "datetime":
case "timestamp":
return "DateTime";
case "tinyblob":
case "blob":
case "mediumblob":
case "longblog":
case "binary":
case "varbinary":
return "byte[]";
case "char":
case "varchar":
case "tinytext":
case "text":
case "mediumtext":
case "longtext":
return "string";
case "point":
case "linestring":
case "polygon":
case "geometry":
case "multipoint":
case "multilinestring":
case "multipolygon":
case "geometrycollection":
case "enum":
case "set":
default:
return dbType;
}
}
public static string GetIsNullable(string type,string nullable)
{
if(nullable.ToLower()=="yes" && type.ToLower() != "string")
return "Nullable<"+type+">";
return type;
}
}
public class Entity
{
public Entity()
{
this.Fields = new List<Field>();
}
public Entity(string name,string comment)
: this()
{
this.EntityName = name;
this.EntityComment = comment;
}
public string EntityName { get;set; }
public string EntityComment { get;set; }
public List<Field> Fields { get;set; }
}
public class Field
{
public string Name { get;set; }
public string Type { get;set; }
public string Comment { get;set; }
public string Key { get;set; }
}
#>
performance/Performance.EntityModels/T4/T4Manager.ttinclude
0 → 100644
View file @
5db6df9a
<#@ assembly name="System.Core"#>
<#@ assembly name="System.Data.Linq"#>
<#@ assembly name="EnvDTE"#>
<#@ assembly name="System.Xml"#>
<#@ assembly name="System.Xml.Linq"#>
<#@ import namespace="System"#>
<#@ import namespace="System.CodeDom"#>
<#@ import namespace="System.CodeDom.Compiler"#>
<#@ import namespace="System.Collections.Generic"#>
<#@ import namespace="System.Data.Linq"#>
<#@ import namespace="System.Data.Linq.Mapping"#>
<#@ import namespace="System.IO"#>
<#@ import namespace="System.Linq"#>
<#@ import namespace="System.Reflection"#>
<#@ import namespace="System.Text"#>
<#@ import namespace="System.Xml.Linq"#>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating"#>
<#+
// T4 Template Block manager for handling multiple file outputs more easily.
// Copyright (c) Microsoft Corporation. All rights reserved.
// This source code is made available under the terms of the Microsoft Public License (MS-PL)
// Manager class records the various blocks so it can split them up
class Manager
{
private struct Block {
public String Name;
public int Start, Length;
}
private List<Block> blocks = new List<Block>();
private Block currentBlock;
private Block footerBlock = new Block();
private Block headerBlock = new Block();
private ITextTemplatingEngineHost host;
private ManagementStrategy strategy;
private StringBuilder template;
public String OutputPath { get; set; }
public Manager(ITextTemplatingEngineHost host, StringBuilder template, bool commonHeader) {
this.host = host;
this.template = template;
OutputPath = String.Empty;
strategy = ManagementStrategy.Create(host);
}
public void StartBlock(String name) {
currentBlock = new Block { Name = name, Start = template.Length };
}
public void StartFooter() {
footerBlock.Start = template.Length;
}
public void EndFooter() {
footerBlock.Length = template.Length - footerBlock.Start;
}
public void StartHeader() {
headerBlock.Start = template.Length;
}
public void EndHeader() {
headerBlock.Length = template.Length - headerBlock.Start;
}
public void EndBlock() {
currentBlock.Length = template.Length - currentBlock.Start;
blocks.Add(currentBlock);
}
public void Process(bool split) {
String header = template.ToString(headerBlock.Start, headerBlock.Length);
String footer = template.ToString(footerBlock.Start, footerBlock.Length);
blocks.Reverse();
foreach(Block block in blocks) {
String fileName = Path.Combine(OutputPath, block.Name);
if (split) {
String content = header + template.ToString(block.Start, block.Length) + footer;
strategy.CreateFile(fileName, content);
template.Remove(block.Start, block.Length);
} else {
strategy.DeleteFile(fileName);
}
}
}
}
class ManagementStrategy
{
internal static ManagementStrategy Create(ITextTemplatingEngineHost host) {
return (host is IServiceProvider) ? new VSManagementStrategy(host) : new ManagementStrategy(host);
}
internal ManagementStrategy(ITextTemplatingEngineHost host) { }
internal virtual void CreateFile(String fileName, String content) {
File.WriteAllText(fileName, content);
}
internal virtual void DeleteFile(String fileName) {
if (File.Exists(fileName))
File.Delete(fileName);
}
}
class VSManagementStrategy : ManagementStrategy
{
private EnvDTE.ProjectItem templateProjectItem;
internal VSManagementStrategy(ITextTemplatingEngineHost host) : base(host) {
IServiceProvider hostServiceProvider = (IServiceProvider)host;
if (hostServiceProvider == null)
throw new ArgumentNullException("Could not obtain hostServiceProvider");
EnvDTE.DTE dte = (EnvDTE.DTE)hostServiceProvider.GetService(typeof(EnvDTE.DTE));
if (dte == null)
throw new ArgumentNullException("Could not obtain DTE from host");
templateProjectItem = dte.Solution.FindProjectItem(host.TemplateFile);
}
internal override void CreateFile(String fileName, String content) {
base.CreateFile(fileName, content);
((EventHandler)delegate { templateProjectItem.ProjectItems.AddFromFile(fileName); }).BeginInvoke(null, null, null, null);
}
internal override void DeleteFile(String fileName) {
((EventHandler)delegate { FindAndDeleteFile(fileName); }).BeginInvoke(null, null, null, null);
}
private void FindAndDeleteFile(String fileName) {
foreach(EnvDTE.ProjectItem projectItem in templateProjectItem.ProjectItems) {
if (projectItem.get_FileNames(0) == fileName) {
projectItem.Delete();
return;
}
}
}
}#>
\ No newline at end of file
performance/Performance.Repository/T4/AutoRepository.cs
0 → 100644
View file @
5db6df9a
performance/Performance.Repository/T4/AutoRepository.tt
0 → 100644
View file @
5db6df9a
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ include file=".\EntityHelper.ttinclude" #>
<#@ include file=".\T4Manager.ttinclude" #>
<#
// 数据库连接
var connectionString = @"server=192.168.18.166;database=db_performance;uid=root;pwd=1234qwer;port=3306;";
// 需要解析的数据库
var database = new List<string> { "db_performance" };
DirectoryInfo directory = new DirectoryInfo(Host.TemplateFile);
var outputPath = Path.Combine(directory.Parent.Parent.FullName);
new DirectoryInfo(outputPath).Create();
var manager = new Manager(Host, GenerationEnvironment, true) { OutputPath = outputPath };
var entities = EntityHelper.GetEntities(connectionString, database);
foreach(Entity entity in entities)
{
var entityName = entity.EntityName.Replace("sys_","").Replace("_","");
entityName = "Perfor" + entityName.Substring(0,1).ToUpper() + entityName.Substring(1);
manager.StartBlock(entityName + "Repository.cs");
#>
//-----------------------------------------------------------------------
// <copyright file=" <#= entity.EntityName #>.cs">
// * FileName: <#= entity.EntityName #>.cs
// * history : Created by T4 <#= DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") #>
// </copyright>
//-----------------------------------------------------------------------
using System;
using Performance.EntityModels;
namespace Performance.Repository
{
/// <summary>
/// <#= entity.EntityName #> Repository
/// </summary>
public class <#= entityName #>Repository : PerforRepository<<#= entity.EntityName #>>
{
public <#= entityName #>Repository(PerformanceDbContext context) : base(context)
{
}
}
}
<#
manager.EndBlock();
}
manager.Process(true);
#>
performance/Performance.Repository/T4/EntityHelper.ttinclude
0 → 100644
View file @
5db6df9a
<#@ assembly name="System.Core"#>
<#@ assembly name="System.Data"#>
<#@ assembly name="$(ProjectDir)\T4\PublicDll\MySql.Data.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="MySql.Data.MySqlClient" #>
<#+
public class EntityHelper
{
public static List<Entity> GetEntities(string connectionString, List<string> databases)
{
var list = new List<Entity>();
var conn = new MySqlConnection(connectionString);
try
{
conn.Open();
var dbs = string.Join("','", databases.ToArray());
var cmd = string.Format(@"SELECT `information_schema`.`COLUMNS`.`TABLE_SCHEMA`
,`information_schema`.`TABLES`.`TABLE_NAME`
,`information_schema`.`TABLES`.`TABLE_COMMENT`
,`information_schema`.`COLUMNS`.`COLUMN_NAME`
,`information_schema`.`COLUMNS`.`DATA_TYPE`
,`information_schema`.`COLUMNS`.`COLUMN_COMMENT`
,`information_schema`.`COLUMNS`.`IS_NULLABLE`
,`information_schema`.`COLUMNS`.`COLUMN_KEY`
FROM `information_schema`.`TABLES`
LEFT JOIN `information_schema`.`COLUMNS`
ON `information_schema`.`TABLES`.`TABLE_NAME`=`information_schema`.`COLUMNS`.`TABLE_NAME`
WHERE `information_schema`.`COLUMNS`.`TABLE_SCHEMA` IN ('{0}') ", dbs);
using (var reader = MySqlHelper.ExecuteReader(conn, cmd))
{
while (reader.Read())
{
var db = reader["TABLE_SCHEMA"].ToString();
var tabcomment = reader["TABLE_COMMENT"].ToString();
var table = reader["TABLE_NAME"].ToString();
var column = reader["COLUMN_NAME"].ToString();
var type = reader["DATA_TYPE"].ToString();
var comment = reader["COLUMN_COMMENT"].ToString();
var nullable = reader["IS_NULLABLE"].ToString();
var key = reader["COLUMN_KEY"].ToString();
var entity = list.FirstOrDefault(x => x.EntityName == table);
if(entity == null)
{
entity = new Entity(table,tabcomment);
entity.Fields.Add(new Field
{
Name = column,
Type =GetIsNullable( GetCLRType(type),nullable),
Comment = comment,
Key = key
});
list.Add(entity);
}
else
{
entity.Fields.Add(new Field
{
Name = column,
Type = GetIsNullable( GetCLRType(type),nullable),
Comment = comment,
Key = key
});
}
}
}
}
finally
{
conn.Close();
}
return list;
}
public static string GetCLRType(string dbType)
{
switch(dbType)
{
case "tinyint":
case "smallint":
case "mediumint":
case "int":
case "integer":
return "int";
case "double":
return "double";
case "float":
return "float";
case "decimal":
return "decimal";
case "numeric":
case "real":
return "decimal";
case "bit":
return "bool";
case "date":
case "time":
case "year":
case "datetime":
case "timestamp":
return "DateTime";
case "tinyblob":
case "blob":
case "mediumblob":
case "longblog":
case "binary":
case "varbinary":
return "byte[]";
case "char":
case "varchar":
case "tinytext":
case "text":
case "mediumtext":
case "longtext":
return "string";
case "point":
case "linestring":
case "polygon":
case "geometry":
case "multipoint":
case "multilinestring":
case "multipolygon":
case "geometrycollection":
case "enum":
case "set":
default:
return dbType;
}
}
public static string GetIsNullable(string type,string nullable)
{
if(nullable.ToLower()=="yes" && type.ToLower() != "string")
return "Nullable<"+type+">";
return type;
}
}
public class Entity
{
public Entity()
{
this.Fields = new List<Field>();
}
public Entity(string name,string comment)
: this()
{
this.EntityName = name;
this.EntityComment = comment;
}
public string EntityName { get;set; }
public string EntityComment { get;set; }
public List<Field> Fields { get;set; }
}
public class Field
{
public string Name { get;set; }
public string Type { get;set; }
public string Comment { get;set; }
public string Key { get;set; }
}
#>
performance/Performance.Repository/T4/T4Manager.ttinclude
0 → 100644
View file @
5db6df9a
<#@ assembly name="System.Core"#>
<#@ assembly name="System.Data.Linq"#>
<#@ assembly name="EnvDTE"#>
<#@ assembly name="System.Xml"#>
<#@ assembly name="System.Xml.Linq"#>
<#@ import namespace="System"#>
<#@ import namespace="System.CodeDom"#>
<#@ import namespace="System.CodeDom.Compiler"#>
<#@ import namespace="System.Collections.Generic"#>
<#@ import namespace="System.Data.Linq"#>
<#@ import namespace="System.Data.Linq.Mapping"#>
<#@ import namespace="System.IO"#>
<#@ import namespace="System.Linq"#>
<#@ import namespace="System.Reflection"#>
<#@ import namespace="System.Text"#>
<#@ import namespace="System.Xml.Linq"#>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating"#>
<#+
// T4 Template Block manager for handling multiple file outputs more easily.
// Copyright (c) Microsoft Corporation. All rights reserved.
// This source code is made available under the terms of the Microsoft Public License (MS-PL)
// Manager class records the various blocks so it can split them up
class Manager
{
private struct Block {
public String Name;
public int Start, Length;
}
private List<Block> blocks = new List<Block>();
private Block currentBlock;
private Block footerBlock = new Block();
private Block headerBlock = new Block();
private ITextTemplatingEngineHost host;
private ManagementStrategy strategy;
private StringBuilder template;
public String OutputPath { get; set; }
public Manager(ITextTemplatingEngineHost host, StringBuilder template, bool commonHeader) {
this.host = host;
this.template = template;
OutputPath = String.Empty;
strategy = ManagementStrategy.Create(host);
}
public void StartBlock(String name) {
currentBlock = new Block { Name = name, Start = template.Length };
}
public void StartFooter() {
footerBlock.Start = template.Length;
}
public void EndFooter() {
footerBlock.Length = template.Length - footerBlock.Start;
}
public void StartHeader() {
headerBlock.Start = template.Length;
}
public void EndHeader() {
headerBlock.Length = template.Length - headerBlock.Start;
}
public void EndBlock() {
currentBlock.Length = template.Length - currentBlock.Start;
blocks.Add(currentBlock);
}
public void Process(bool split) {
String header = template.ToString(headerBlock.Start, headerBlock.Length);
String footer = template.ToString(footerBlock.Start, footerBlock.Length);
blocks.Reverse();
foreach(Block block in blocks) {
String fileName = Path.Combine(OutputPath, block.Name);
if (split) {
String content = header + template.ToString(block.Start, block.Length) + footer;
strategy.CreateFile(fileName, content);
template.Remove(block.Start, block.Length);
} else {
strategy.DeleteFile(fileName);
}
}
}
}
class ManagementStrategy
{
internal static ManagementStrategy Create(ITextTemplatingEngineHost host) {
return (host is IServiceProvider) ? new VSManagementStrategy(host) : new ManagementStrategy(host);
}
internal ManagementStrategy(ITextTemplatingEngineHost host) { }
internal virtual void CreateFile(String fileName, String content) {
File.WriteAllText(fileName, content);
}
internal virtual void DeleteFile(String fileName) {
if (File.Exists(fileName))
File.Delete(fileName);
}
}
class VSManagementStrategy : ManagementStrategy
{
private EnvDTE.ProjectItem templateProjectItem;
internal VSManagementStrategy(ITextTemplatingEngineHost host) : base(host) {
IServiceProvider hostServiceProvider = (IServiceProvider)host;
if (hostServiceProvider == null)
throw new ArgumentNullException("Could not obtain hostServiceProvider");
EnvDTE.DTE dte = (EnvDTE.DTE)hostServiceProvider.GetService(typeof(EnvDTE.DTE));
if (dte == null)
throw new ArgumentNullException("Could not obtain DTE from host");
templateProjectItem = dte.Solution.FindProjectItem(host.TemplateFile);
}
internal override void CreateFile(String fileName, String content) {
base.CreateFile(fileName, content);
((EventHandler)delegate { templateProjectItem.ProjectItems.AddFromFile(fileName); }).BeginInvoke(null, null, null, null);
}
internal override void DeleteFile(String fileName) {
((EventHandler)delegate { FindAndDeleteFile(fileName); }).BeginInvoke(null, null, null, null);
}
private void FindAndDeleteFile(String fileName) {
foreach(EnvDTE.ProjectItem projectItem in templateProjectItem.ProjectItems) {
if (projectItem.get_FileNames(0) == fileName) {
projectItem.Delete();
return;
}
}
}
}#>
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment