我正在尝试发布和使用版本化的类库的NuGet包,同时避免了本地开发的麻烦.以下是Visual Studio解决方案布局示例:
| Libraries
| LibraryA
| LibraryB
| LibraryC
| Applications
| ApplicationD
| ApplicationE
Run Code Online (Sandbox Code Playgroud)
这是一个包含共享类库和多个应用程序的单一解决方案.目前,应用程序对类库的引用是本地解决方案引用.
我想要做的是将库(A,B,C)发布为版本化的NuGet包,然后由应用程序根据需要引用它们(D,E).这允许对共享库的更改独立于对已部署的应用程序的更新.如果没有这个,更改一个库可能会导致二进制文件在十几个或更多应用程序中发生变化,所有这些都在技术上需要进行测试.这是不可取的,使用NuGet进行版本控制可以解决这个问题.
但是,我们要说我想同时更新LibraryA和ApplicationD的内容.为了在切换到NuGet之后执行此操作,我将不得不对LibraryA进行更改,提交它们,等待创建包,告诉ApplicationD更新其对LibraryA的引用,然后在ApplicationD中进行测试或开发.这比使用本地解决方案引用同时处理两者要复杂得多.
有什么更好的方法来获得我的共享类库的版本化NuGet包的健壮性,同时即使它跨越多个项目和应用程序也保持开发简单?我发现的唯一其他解决方案都涉及太多开销或头痛,例如不得不在NuGet包和本地项目之间不断更改ApplicationD的引用.
编辑:为了澄清前提,这个问题假设如下:
我正在尝试为符合多个标准的商业产品开发数据管理解决方案.标准和我的推理如下:
要求#1:我的应用程序是用C#编写的,我希望任何解决方案都不涉及与其他语言的应用程序,库或代码集成.
要求2:我想要使用几个基于JSON的工具和库,所以我需要一个解决方案,其中数据可以容易地转换为JSON或从JSON转换.
要求3:我想避免使用关系数据库解决方案带来的架构维护.我更喜欢在代码中管理不匹配的数据到对象映射,并让代码更新旧数据,而不是单独管理模式更新.
要求#4:我要求始终将部分或全部数据加载到内存中,并将所有数据保存到磁盘.数据是否在内存中持续存在应该是每种数据类型可选的.
要求#5:安装我的产品时,我不希望进行任何二次安装或运行除我的应用程序之外的任何外部服务.一个完全独立的解决方案是最好的.
要求#6:预期用途是用于分布式商业产品.我宁愿避免许多第三方解决方案带来的任何额外费用或许可问题.
到目前为止,我尝试了几种解决方案 最初我没有那么多限制,并且使用了SQLite.NET并且它的使用并不令人不愉快,但架构维护和数据格式的开销超出了我的预期.我调查了很多NoSQL解决方案(例如RavenDB),其他第三方解决方案(Karvonite)和简单的JSON文件存储实现,但我对它们中的任何一个都不满意.
是否存在我缺少的自定义方法或解决方案,其他人已成功使用?我希望我只是忽略了我所追求的选项,并且那些NoSQL和.NET专家在这方面有足够的经验指出我正确的方向.
编辑:如果任何原始评论员感到困惑,我更新了问题和标题,以更好地遵守SO的政策.
希望这是一个我忽略的简单修复.我有一个对象传递到一个事件处理程序,我想使用JSON.NET序列化该对象,如下所示:
public void OnEvent(IEventObject foo)
{
// Serialize foo to string/disk here?
var data = JsonConvert.SerializeObject(foo, Formatting.Indented);
}
Run Code Online (Sandbox Code Playgroud)
似乎foo的一个或多个成员是流.我已经认识到Streams不可序列化,因为它们是数据的抽象而不是数据本身.这是有道理的.
我不知道如何序列化这个对象:
对此的一个重要警告是我无法访问IEventObject或其实现,因此我无法使用属性标记标记任何这些对象.
我提出的唯一解决方案是将此对象包装在我自己的类中,对其进行适当标记,然后对其进行序列化.稍后我会反序列化回我自己的类,并将其转换为原始对象.我不喜欢这种方法,因为它涉及额外的对象和转换步骤,并且如果可能的话希望避免它.
我想在特定时间段内自动切换警报开/关,以便在维护窗口期间不会触发警报.我怀疑是否存在简单或直接的方法,因为我在文档中找不到这样的东西.有没有人知道在使用CloudWatch警报时实现这一目标的不同方法,还是我错过了一个明显的解决方案?
我正在从快照创建新的RDS MySQL实例,并通过API和UI更新其配置.无论我如何创建或更新实例,这些操作都会自动触发通过某种自动备份过程创建的新快照.有没有办法在执行这些操作时禁用快照创建,因为我不需要额外的快照,并且它们的创建导致不必要的延迟?
问题:创建新的IIS应用程序池并将其设置为使用应用程序池标识获取权限时,我不确定如何将这些标识添加到用户组(如管理员或性能计数器用户).
背景:我目前正在编写一个C#.NET库,它使用Microsoft.Web.Administration来执行以下操作:
上下文是可执行安装程序将此库用于在Windows Server操作系统上自动部署Web服务器和Web站点/服务,作为更大的软件部署的一部分.到目前为止,除了需要在应用程序池/网站创建上执行的某些权限的自动化之外,所有上述内容都已实现,测试并且(大部分)功能正常.
在我安装新网站的方法中,我创建了一个新的应用程序池并强制它使用应用程序池标识:
static public void InstallSite(string name, string path, int port)
{
Site site;
var appPoolName = ApplicationPoolBaseName + name;
using (var iisManager = new ServerManager())
{
// Set up a custom application pool for any site we run.
if (!iisManager.ApplicationPools.Any(pool => pool.Name.Equals(appPoolName)))
{
iisManager.ApplicationPools.Add(appPoolName);
iisManager.ApplicationPools[appPoolName].ManagedRuntimeVersion = "v4.0";
}
iisManager.CommitChanges();
}
// ... other code here ('site' gets initialized) ...
using (var iisManager = new ServerManager())
{
// Set …Run Code Online (Sandbox Code Playgroud) c# permissions application-pool iis-7.5 applicationpoolidentity
我目前正在使用Web API 2的属性路由实现Web API(http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api -2).我还使用"帮助页面"模块,以便从XML注释中自动生成文档(http://www.asp.net/web-api/overview/creating-web-apis/creating-api-help-pages).
对于这个API,我提供了对可选返回格式扩展的支持,因此每个API方法都有一对定义的路由,如下所示:
[HttpGet]
[Route("Path/Foo")]
[Route("Path/Foo.{ext}")]
public HttpResponseMessage DoFoo()
{
// Some API function.
}
Run Code Online (Sandbox Code Playgroud)
这允许用户点击其中任何一个并获得结果:
www.example.com/api/Controller/Path/Foo
www.example.com/api/Controller/Path/Foo.json
www.example.com/api/Controller/Path/Foo.xml
Run Code Online (Sandbox Code Playgroud)
我的问题是,当帮助页面使用MapHttpAttributeRoutes()生成文档时,它会为每个方法选择两个路径.所以现在我看到帮助:
api/Controller/Foo
api/Controller/Foo.{ext}
Run Code Online (Sandbox Code Playgroud)
但我只想看到:
api/Controller/Foo.{ext}
Run Code Online (Sandbox Code Playgroud)
我宁愿在每个方法上隐藏非扩展路由,这样每个方法只显示一个帮助页面条目.
有没有其他人尝试类似的东西?有没有我失踪的工作?
routing asp.net-web-api attributerouting asp.net-web-api-helppages
我正在尝试组织大量 CloudWatch 警报以实现可维护性,并且 Web 控制台在编辑时将名称字段灰显。是否有另一种方法(最好是可编写脚本的)来更新 CloudWatch 警报的名称?除了简单的可执行脚本之外,我更喜欢不需要任何编程的解决方案。