我正在尝试自动设置datagrip工作。每个项目都有一些文件来定义数据源是什么,工作区是什么样的等等。令我困惑的部分是如何实现“multifile-model
”的想法。下面是一个示例:为了便于使用,我将每个项目放在一个git存储库中并创建了一个新项目并提交了它。然后我添加了一个新的数据库连接到ms.sql数据库,需要Windows身份验证。在dataSources.xml
中,它看起来类似于
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source name="test" source="LOCAL" uuid="fcc0408c-408c-fcc0-e254-83c7094db613">
<driver-ref>sqlserver.ms</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>com.microsoft.sqlserver.jdbc.SQLServerDriver</jdbc-driver>
<jdbc-url>jdbc:sqlserver://myserver\someinstance;databaseName=somedatbase;</jdbc-url>
<auto-commit>false</auto-commit>
</data-source>
<!-- 95 more datasources -->
</component>
</project>
使这部分变得相当容易
DataSourceElement.cs
[XmlRoot("data-source")]
public class DataSourceElement
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAttribute("source")]
public string Source { get; set; }
[XmlAttribute("uuid")]
public Guid Uuid { get; set; }
[XmlElement("driver-ref")]
public string DriverRef { get; set; }
[XmlElement("synchronize")]
public bool Synchronized { get; set; }
[XmlElement("jdbc-driver")]
public string DriverName { get; set; }
[XmlElement("jdbc-url")]
public string DriverUrl { get; set; }
[XmlElement("default-dialect")]
public string DefaultDialect { get; set; }
[XmlElement("auto-commit")]
public bool IsAutoCommit { get; set; }
[XmlArray("driver-properties")]
[XmlArrayItem("property")]
public List<DatagripPropertyElement> DriverProperties { get; set; } = new List<DatagripPropertyElement>();
[XmlArray("jdbc-additional-properties")]
[XmlArrayItem("property")]
public List<DatagripPropertyElement> DriverAdditionalProperties { get; set; } = new List<DatagripPropertyElement>();
}
DataSourceManagerImpl.cs **
[XmlRoot("component")]
public class DataSourceManagerImpl : ComponentElement
{
[XmlAttribute("format")]
public string Format { get; set; }
[XmlAttribute("multifile-model")]
public bool MultiFileModel { get; set; }
[XmlElement("data-source")]
public List<DataSourceElement> DataSources { get; set; } = new List<DataSourceElement>();
}
[XmlRoot("component")]
public abstract class ComponentElement
{
[XmlAttribute("name")]
public string Name { get; set; }
}
DataSourceProject.cs
[XmlRoot("project")]
public class DataSourceProject : ProjectElement
{
[XmlElement("component")]
public DataSourceManagerImpl Component { get; set; }
}
[XmlRoot("project")]
public abstract class ProjectElement
{
[XmlAttribute("version")]
public int Version { get; set; }
}
linqpad进行测试
private const string DATAGRIP_PROJECT = @"C:\Users\snyder\.DataGrip2017.3\config\projects";
void Main()
{
DataSourceManager = new DataSoureProject();
//initialize omitted
Save(DATAGRIP_PROJECT, "default");
}
public void Save(string datagripProjectPath, string datagripProjectName)
{
var projectPath = Path.Combine(datagripProjectPath, datagripProjectName, ".idea");
WriteToFile(DataSourceManager, Path.Combine(projectPath, "datasources.xml"));
}
private static void WriteToFile<T>(T obj, string fullPath, bool omitXmlDeclaration = true)
{
var settings = new XmlWriterSettings
{
OmitXmlDeclaration = omitXmlDeclaration,
Encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false),
Indent = true,
};
using (var writer = XmlWriter.Create(fullPath, settings))
{
var ns = new XmlSerializerNamespaces();
ns.Add("", "");
var serializer = new XmlSerializer(typeof(T));
serializer.Serialize(writer, obj, ns);
}
}
然后我查看datasources.Local.xml,其中包含我想要的位
<data-source name="test" uuid="fcc0408c-408c-fcc0-e254-83c7094db613">
<database-info product="" version="" jdbc-version="" driver-name="" driver-version="" />
<domain-auth>true</domain-auth>
</data-source>
首先,我考虑将所述属性添加到我的DataSourceElement类,但无法弄清楚如何拆分属性。那么我就像..我想我可以复制课程并假装他们是不同的。任何人,搜索都没有发现。所以现在我问..是否可以在我的DataSourceElement类中添加一些属性,这些属性只会添加到另一个文件中?如果是这样的话?
答案 0 :(得分:0)
我想我想到的东西可能会让它更容易,并且基于@jdweng和@ code4life评论
我在想,如果我要查看jetbrains项目是否存在,我可以使用序列化来创建文件夹和文件。这很容易也很简单,因为它只是骨架。然后,我可以使用XDocument
加载骨架,并根据需要使用AutoMapper
更新/创建连接,以便根据需要创建XElement
。这应该可以使所有方面的生活更轻松,并且如果需要的话可以轻松添加,或者如果jetbrains决定更改编码,则可以更改它。