我正在创建一个自定义.NET Core ILoggerProvider,需要将一些依赖项传递给它的构造函数.
我相信我使用一种相当常见的模式来初始化我的日志记录实现; 它看起来像这样:
var services = new ServiceCollection();
// Register some services here
services.AddLogging(builder =>
{
builder.AddProvider(new DebugLoggerProvider());
});
var provider = services.BuildServiceProvider();
Run Code Online (Sandbox Code Playgroud)
我想在AddLogging块中添加我的新提供者,就像DebugLoggerProvider当前添加的一样.
我的自定义提供程序需要将其他一些服务传递给它的构造函数,因为这些服务已经注册了ServiceCollection,我假设我应该能够引用它们.然而,与诸如AddSingleton具有暴露的过载的方法不同IServiceProvider,AddLogging似乎不提供等价物.
有没有一种简单的方法来实现这一点,或者我是否尝试做一些与.NET Core日志设计部署方式相矛盾的事情?
更新:
在试验了@Nkosi提出的建议之后,我可以确认通过绕过AddLogging并直接实现内部的工作来实现这一点,如下所示:
var services = new ServiceCollection();
// Register some services
services.AddSingleton<IMyService, MyService>();
// Initialize logging
services.AddOptions();
services.AddSingleton<ILoggerFactory, LoggerFactory>();
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
services.AddSingleton<ILoggerProvider>(p => new DebugLoggerProvider());
services.AddSingleton<ILoggerProvider>(p => new MyLoggerProvider("Constant value", p.GetService<IMyService>()));
var provider = services.BuildServiceProvider();
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个工厂方法,该方法将创建抽象泛型集合类的派生实例.这是基类......
abstract class ItemBase { }
abstract class CollectionBase<T> : Collection<T> where T : ItemBase, new() { }
Run Code Online (Sandbox Code Playgroud)
......及其派生类......
class Item : ItemBase { }
class ItemCollection : CollectionBase<Item> {}
Run Code Online (Sandbox Code Playgroud)
现在,我想要一个将创建ItemCollection的工厂方法.但请注意,派生类Item和ItemCollection对于包含此工厂方法的类是未知的.这就是我想象的应该......
static T CreateItemCollection<T>() where T : CollectionBase<ItemBase>, new()
{
return new T();
}
Run Code Online (Sandbox Code Playgroud)
......我想像这样调用它......
var collection = CreateItemCollection<ItemCollection>();
Run Code Online (Sandbox Code Playgroud)
但是工厂方法不会编译,因为ItemBase必须具有无参数构造函数.并且invokation调用拒绝相信ItemCollection来自CollectionBase<ItemBase>.
有人可以指点我正确的方向吗?谢谢.
我试图DataTrigger在Xamarin Forms页面的XAML中使用一个简单的元素:
<Frame BackgroundColor="Red" HorizontalOptions="Fill" VerticalOptions="FillAndExpand">
<Frame.Triggers>
<DataTrigger TargetType="Frame" Binding="{Binding IsValid}" Value="True">
<Setter Property="BackgroundColor" Value="{x:Static Color.Lime}" />
</DataTrigger>
</Frame.Triggers>
</Frame>
Run Code Online (Sandbox Code Playgroud)
此配置会使应用程序崩溃,实际上是NullReferenceException:
Java.Lang.NullPointerExceptionAttempt在空对象引用上调用虚方法'boolean android.graphics.Bitmap.isMutable()'
如果我Setter在上面的示例中注释掉,应用程序正常运行,但当然,触发器不起作用.
任何人都可以建议我做错了什么?
我有一个带有两个重载的方法,如下所示:
bool Evaluate(Func<bool> condition)
{
// Some logic
return condition.Invoke();
}
bool Evaluate<T>(Func<T, bool> condition, T value)
{
// Same logic as the first method overload
return condition.Invoke(value);
}
Run Code Online (Sandbox Code Playgroud)
由于两个方法重载都包含大致相同的逻辑,我希望将它们链接在一起,但我看不到如何做到这一点.我想第一个方法overoad需要构造一个委托,它传递给第二个重载,但是不清楚这个委托应采取什么形式.
非常感谢你的建议,
蒂姆
c# ×3
.net-core ×1
constraints ×1
datatrigger ×1
delegates ×1
factory ×1
generics ×1
logging ×1
predicate ×1
xamarin ×1