精简版:
应用程序事件日志中是否始终包含事件源"应用程序"和"应用程序错误"?它们是否适用于Windows XP,Vista和Windows 7的新安装?使用它们而不是创建我自己的源(对我来说是不可能的)真的很糟糕吗?
长版:
我有一个ClickOnce应用程序,用户在没有管理员权限的情况下使用它们.
当我尝试写入Appliction事件日志时,我收到安全异常.(Windows事件日志记录基础结构正在尝试创建一个新的事件源,并获得安全性违规.)
所以我想尝试重用现有的事件源.我在应用程序事件日志中找到了两个"通用声音"源.这些是否始终是Windows安装的一部分,并且会做出合理的选择?
我确信这是不赞成的,因为我应该使用自己的事件源来区分我的应用程序.但这是因为不常发生的致命错误,应该通过我的代码记录到其他地方.我只想要一个非常容易的地方在客户端机器上找到它们以防万一出错...
我正在通过FileStream改变文件(它是一个非常大的文件,我只需要改变标题而不重写整个文件.
该文件可以有Unix或Windows换行符,对我来说知道哪些是很重要的,这样我在更新时就可以将正确的换行符写回文件中.
我可以编写一个简单的函数来使用FileStream来读取块中的文件并检查换行符.
但是这个问题必须先解决,如果不是在C#中,那么在Win32 API中呢?
检测文件换行方式的最有效方法是什么?
我想使用LINQ在一行中重写以下代码.可能吗?
var to = new MailAddressCollection();
foreach(string recipient in recipients)
{
to.Add(new MailAddress(recipient));
}
Run Code Online (Sandbox Code Playgroud)
像下面这样的东西是理想的.如上所述,它返回多个MailAddressCollections:
var to = recipients.Select(r => new MailAddressCollection() {new MailAddress(r)});
Run Code Online (Sandbox Code Playgroud)
请注意,这些是框架类,因此我无法重写MailAddressCollection以包含构造函数参数.
我已经在.Net Core 2.0中的网站上工作了几个月。我刚刚升级到.Net Core 2.1,现在Startup.Configure()没有调用该方法。
我的Program课上有以下代码,该代码创建了IWebHost:
private static IWebHost BuildWebHost(string[] args)
{
return WebHost
.CreateDefaultBuilder()
.ConfigureAppConfiguration(LoadAppConfiguration)
.UseStartup<Startup>()
.Build();
}
Run Code Online (Sandbox Code Playgroud)
在我升级框架之前,它一直运行良好,可以实例化Startup并正确调用ConfigureServicesand Configure方法。
现在,尽管Startup正在实例化,Configure但不再被调用。(不会引发任何异常。)
我意识到应用程序启动中还有很多其他代码。但是,我唯一要做的就是将.Net Core SDK从2.0更新到2.1。
也许有人知道可能会发生什么变化或我可以调查什么?
简单来说:
将汇编名称和类名存储在数据库中是否可以原谅?它是否会破坏应用程序层以使数据层明确了解业务层的内部结构?
完整说明:
我有一个引导过滤器,它运行在单独的程序集中存在的"作业"(继承自公共基础的类).作业具有存储在数据库中的配置参数,以允许通过GUI改变它们的操作.
为了找到并运行作业,引导strapper有一个app.config文件,其中包含作业的名称,以及定义它的程序集名称和类名.
我被要求将程序集名称和类名移动到数据库中,以便我们可以删除app.config文件.(给出的理由是将所有配置保存在一个地方 - 数据库.)
但是,引导过滤器是运行作业的唯一代码,部署后永远不会更改此"配置"信息.我认为将这些信息放入数据库会为数据层提供有关上述层的过多信息,并会妨碍重构和维护.但是,我知道Windows Workflow Foundation就是这样做的,所以也许我认为这是一个糟糕的做法我错了?
编辑:
在回答下面的问题时,数据库连接字符串存储在由共享配置框架管理的单独配置文件中.此框架使技术上可以完全删除app.config文件.
注入记录器时,我正在为生活方式问题而苦苦挣扎。
NLOG预期实例被创建“按相关性实例”,这里描述- https://simpleinjector.readthedocs.io/en/latest/lifetimes.html#instance-per-dependency。
使用工厂方法完成记录器的创建LogManager.GetCurrentClassLogger()。使用此模式,记录器可以获取呼叫者的姓名,以便将其包括在记录的消息中。
Simple Injector告诉我,我的Transient记录器无法注入单例。但是我无法将生活方式更改为Singleton,因为这样我会丢失有关哪个类正在调用记录器的上下文信息。
我的实现如下:
我编写了一个工厂,该工厂创建NLog实例,并在实现我自己的ILogger抽象的包装器中将其返回:
internal class LoggerFactory : ILoggerFactory
{
public ILogger GetLogger()
{
return new NLogLogger(LogManager.GetCurrentClassLogger());
}
}
Run Code Online (Sandbox Code Playgroud)
我这样在Simple Injector上注册了它:
container.RegisterSingleton<ILoggerFactory, LoggerFactoryInstance>();
container.Register<ILogger>(
() => container.GetInstance<ILoggerFactory>().GetLogger());
Run Code Online (Sandbox Code Playgroud)
而且我依赖需要记录的类中的ILogger接口:
public class MyClass
{
private readonly ILogger _logger;
public MyClass(ILogger logger)
{
_logger = logger;
}
}
Run Code Online (Sandbox Code Playgroud)
我必须注入工厂吗?我宁愿不必在要使用它的任何地方解析记录器,但是也许这就是Simple Injector所期望的?
其他人如何处理呢?有没有更好的办法?