小编Ste*_*ven的帖子

使用 Simple Injector 自动注册通用存储库

我找不到使用 Simple Injector (v3) 注册通用存储库的方法。

我有一个基类GenericRepository<T>和一个接口ILinkRepository。基类和接口都实现IGenericRepository<T>. 我对存储库的实现LinkRepository继承GenericRepository<T>并实现了ILinkRepository.

然后我有一个服务类,它通过构造函数获取存储库LinkService(ILinkRepository repository)

我想通过 Simple Injector 自动注册我的通用存储库,所以我试过这个:

container.Register(typeof(IGenericRepository<>), new []
{
    typeof(IGenericRepository<>).Assembly
});
Run Code Online (Sandbox Code Playgroud)

当 Simple Injector 尝试验证我的容器时,出现错误:

LinkService 类型的构造函数包含名称为“repository”且类型为 ILinkRepository 的未注册参数。请确保 ILinkRepository 已注册...

那么有没有其他方法可以告诉 Simple Injector ILinkRepository 是一个 LinkRepository 实例而无需像下面那样直接注册它?

container.Register<ILinkRepository, LinkRepository>()
Run Code Online (Sandbox Code Playgroud)

c# generics dependency-injection simple-injector

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

设置 Topshelf 和 Quartz.Net 控制台应用程序时从 Ninject 访问对象

在配置 Ninject/Topshelf/Quartz.Net 设置期间使用对象的正确方法是什么?

我创建了一个IocModule将我的接口绑定到一个具体类:

public class IocModule : NinjectModule
{
    public override void Load()
    {
        Bind<IConfiguration>().To<JsonConfiguration>().InSingletonScope();
    }
}
Run Code Online (Sandbox Code Playgroud)

在运行时间的 Quartz.Net 设置期间,我需要此配置中的一些值,但使用IConfiguration configuration = new JsonConfiguration();似乎不是执行此操作的正确方法:

namespace Question {
    public class Program {
        public static int Main(string[] args) {
            var exitCode = HostFactory.Run(c => {
                c.UseNinject(new IocModule());

                // How can I get this from Ninject?
                IConfiguration configuration = new JsonConfiguration();
                configuration.Load();
                c.Service<Service>(sc => {
                    sc.ConstructUsingNinject();
                    sc.WhenStarted((service, control) => service.Start(control));
                    sc.WhenStopped((service, control) => service.Stop(control));
                    sc.UseQuartzNinject();
                    sc.ScheduleQuartzJob(q => q.WithJob(() …
Run Code Online (Sandbox Code Playgroud)

c# ninject scheduled-tasks quartz.net topshelf

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

使用 Log4net 的简单注入器和日志记录抽象

为了尝试使用 Log4net 获得良好的日志记录抽象,我从这篇 SO 帖子中获取了抽象,并从这篇 SO 帖子中获取了适配器,并尝试让它们一起工作。

真正剩下要做的就是配置容器,而这是我尚未成功完成的部分。

我尝试过的配置是

public static class InfrastructureRegistry
{
    public static void RegisterLoggingServices(this Container container)
    {
        container.RegisterConditional(typeof(ILog), c => LogManager.GetLogger(
            c.Consumer.ImplementationType).GetType(), 
            Lifestyle.Scoped, c => true);
        container.RegisterPerWebRequest<ILogger, Log4netAdapter>();
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您从代码中看到的,我想要一个特定的 log4net 记录器,它从注入的类中获取其类型。虽然大多数日志记录都是以包罗万象的方式完成的,但我希望在较低层中进行一些日志记录,例如当表单验证失败时。

ActivationException通过该配置得到的是:

LogImpl 类型的构造函数包含名称为“logger”且类型为 ILogger 的未注册参数。请确保ILogger已注册,或更改LogImpl的构造函数。

不太确定从这里去哪里,所以任何帮助将不胜感激。

编辑

抱歉,我应该指出,我正在尝试编写它,这样我只需编写此配置一次。以下工厂函数有效,但我不想每次要注入记录器时都手动添加更多配置:

container.RegisterPerWebRequest<ILog>(() => LogManager.GetLogger(typeof(LoginController)));
Run Code Online (Sandbox Code Playgroud)

c# log4net simple-injector

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

将依赖项注入实体框架实体和项目

有没有办法将依赖项注入从EF Linq context.Entities.Select(x => new Y {...})投影返回的对象?(我使用的是Simple Injector,但概念仍然存在)

我试图实现的一些事情:(这只是输入,没有编译,抱歉任何语法错误/不完整)

// person MAY be an entity, but probably more likely a class to serve a purpose
public class Person {
  public string Name
  public DateTime DOB {get;set; }

  // what I want to achieve: note, I don't want to have complex logic in my model, I want to pass this out to a Service to determine.. obviously this example is over simplified...
  // this could be a method or a …
Run Code Online (Sandbox Code Playgroud)

c# linq entity-framework dependency-injection simple-injector

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

使用 Simple Injector 注册集合

我尝试在 c# 中使用简单的注入器注册一个集合。我的方法如下:

container.Collection.Register<IValidateMitarbeiter>(
    typeof(MitarbeiterVerfuegbarkeitValidator),
    typeof(MitarbeiterQualifikationsValidator));
Run Code Online (Sandbox Code Playgroud)

但我收到此错误消息:

配置无效。创建 IDispoLinienManager 类型的实例失败。DispoLinienManager 类型的构造函数包含名称为“mitarbeiterValidators”且类型为 IValidateMitarbeiter 的未注册参数。请确保 IValidateMitarbeiter 已注册,或更改 DispoLinienManager 的构造函数。

这是 DispoLinienManager 的构造函数

public DispoLinienManager(IDataContextFactory dataContextFactory,
        IDispoPlanLinieFactory dispoPlanLinieFactory,
        IValidateMitarbeiter mitarbeiterValidators)
    {
        this.dataContextFactory = dataContextFactory;
        this.dispoPlanLinieFactory = dispoPlanLinieFactory;
        this.mitarbeiterValidators = mitarbeiterValidators;
    }
Run Code Online (Sandbox Code Playgroud)

IValidateMitarbeiter 有两个实现,它们都在 DispoLinienManager 中使用。如果有任何遗漏的信息,我将很乐意帮助您解决我的问题。

c# dependency-injection simple-injector

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

简单的喷射器将具体类型与生活方式结合起来

我正在寻找一种可以使用指定的生活方式注册具体类型的方法,基本上如下所示。

public void SomeFunction( Type concrete, Lifestyle lifestyle ) =>
    container.Register( concrete, lifestyle );
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection simple-injector

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

Ninject中.Resolve和.Get之间的区别

只是想对ninject中Kernel.Resolve和Kernel.Get之间的区别做一些澄清.

Kernel.Get状态的描述

通过使用与指定约束匹配的第一个绑定来获取指定服务的实例

Kernel.Resolve状态的描述

解析指定请求的实例.在消费者迭代枚举之前,实际上并未解析实例.

您可以在哪些情况下使用其中任何一种?(现在我正在使用Get)

ninject

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

参数名称:root 不能为 Null 异常 Ninject

我在代码重构后收到来自 Ninject 的异常。因此我知道是什么导致了错误,但无法确定原因。代码编译文件,但我从 Ninject 收到运行时错误:

不能为空参数名:root

我正在尝试注入一个类的常量实例:

var subscriptionApiClientHelper = new SubscriptionApiClientHelper(AppSettings.Get<string>("AdminAPIUrl"),
            AppSettings.Get<string>("APIV2Key"), Kernel.Get<ICache>());

kernel.Bind<SubscriptionApiClientHelper>().ToConstant(subscriptionApiClientHelper);
Run Code Online (Sandbox Code Playgroud)

Ninject 在第一行抛出异常。

我的类 SubscriptionApiClientHelper 继承自另一个类(在 Nuget 包中引用),因此:

public SubscriptionApiClientHelper(string baseUrl, string apiKey, ICache cache) : base(baseUrl, apiKey)
{
     _cache = cache;
}
Run Code Online (Sandbox Code Playgroud)

其构造函数是这样的:

 public SubscriptionApiClient(string baseUrl, string apiKey)
 {
     _baseUrl = baseUrl;
     _apiKey = apiKey;
 }
Run Code Online (Sandbox Code Playgroud)

这个基类中的几个方法被覆盖并实现了缓存,因此覆盖的原因是我不需要在基类的所有方法上实现缓存。我从同一个 Nuget 包中注入了一些其他类,但没有问题,但这些没有我怀疑导致问题的继承。注意我成功地注入并使用了我继承的基类(SubscriptionApiClient),它只是导致问题的辅助类。

这是完整的堆栈跟踪:

at Ninject.ResolutionExtensions.GetResolutionIterator(IResolutionRoot root, Type service, Func`2 constraint, IEnumerable`1 parameters, Boolean isOptional, Boolean isUnique)
at Ninject.ResolutionExtensions.Get[T](IResolutionRoot root, IParameter[] parameters)
at AdminPortal.NinjectWebCommon.RegisterServices(IKernel kernel) …
Run Code Online (Sandbox Code Playgroud)

.net c# asp.net-mvc dependency-injection ninject

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

如何在Startup.cs中注册Generic类型的接口

我在ASP.NET Core中使用WebAPI.

这有效:

services.AddScoped<IApiKeysService, APIKeysService>();
Run Code Online (Sandbox Code Playgroud)

现在接口返回泛型类型T这不是

services.AddScoped<IApiKeysService>();
Run Code Online (Sandbox Code Playgroud)

错误使用泛型类型blah需要1种类型的参数

或这个

services.AddScoped<IApiKeysService<T>>();
Run Code Online (Sandbox Code Playgroud)

我得到以下编译错误

无法找到类型或命名空间T.

我该如何注册Startup.cs

注意:我不能使用具体类型,因为接口成员是具有泛型方法的基类.

c# generics dependency-injection .net-core asp.net-core

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

如何在简单注入器中注册实例集合

在我的项目中,我有多个数据库上下文,因此我创建了一个提供程序,用于根据需要获取上下文对象。我的提供者看起来像这样。

public class DbContextProvider
{
    public Func<AccountingContext> AccountingDbContextResolver { get; set; }

    public Func<ActiveDirectryContext> ActiveDirectryDbContextResolver { get; set; }

    public AccountingContext GetAccountingDbContext() =>
        this.AccountingDbContextResolver();

    public ActiveDirectryContext GetActiveDirectryDbContext() =>
        this.ActiveDirectryDbContextResolver();
}
Run Code Online (Sandbox Code Playgroud)

ServiceBase我为获取提供者而创建的一类

public class ServiceBase
{
    public ServiceBase(DbContextProvider contextProvider)
    {
        this.ContextProvider = contextProvider;
    }

    protected DbContextProvider ContextProvider { get; }

    public AccountingContext AccountingDbContext =>
        this.ContextProvider.GetAccountingDbContext();

    public ActiveDirectryContext ActiveDirectryDbContext =>
        this.ContextProvider.GetActiveDirectryDbContext();
}
Run Code Online (Sandbox Code Playgroud)

我正在使用简单的注入器,我需要创建两个数据库上下文的实例。

为了获取实例,我使用委托创建了两个静态方法

private static DbContextProvider CreateActiveDirectryDbContextProvider(Container container)
{
    return new DbContextProvider
    {
        ActiveDirectryDbContextResolver =
            () => container.GetInstance<ActiveDirectryContext>();
    };
} …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc dependency-injection simple-injector

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