小编Tim*_*ter的帖子

如何将依赖项传递给自定义.NET Core ILoggerProvider

我正在创建一个自定义.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)

c# logging dependency-injection .net-core .net-core-2.0

3
推荐指数
1
解决办法
1372
查看次数

C# - 如何从工厂方法创建继承的泛型集合

我正在尝试编写一个工厂方法,该方法将创建抽象泛型集合类的派生实例.这是基类......

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>.

有人可以指点我正确的方向吗?谢谢.

c# factory constraints generic-collections

2
推荐指数
1
解决办法
1240
查看次数

Xamarin Forms DataTrigger导致NullReferenceException

我试图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在上面的示例中注释掉,应用程序正常运行,但当然,触发器不起作用.

任何人都可以建议我做错了什么?

datatrigger xamarin.android xamarin xamarin.forms

2
推荐指数
1
解决办法
372
查看次数

如何链接接受Func <>委托的方法重载?(C#)

我有一个带有两个重载的方法,如下所示:

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# generics delegates predicate

1
推荐指数
1
解决办法
1241
查看次数