Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用泛型参数创建注册_C#_Dependency Injection_Simple Injector - Fatal编程技术网

C# 使用泛型参数创建注册

C# 使用泛型参数创建注册,c#,dependency-injection,simple-injector,C#,Dependency Injection,Simple Injector,我有一个实体读写器的通用实现。我想将这些文件注册到同一个实例。但这失败了,例外情况如下: 中发生“System.InvalidOperationException”类型的异常 mscorlib.dll,但未在用户代码中处理 我认为我们缺少了一些先决条件检查,因为您无法为开放泛型类型创建Registration对象。注册实例特定于封闭的泛型或非泛型类型。这意味着CreateRegistration(typeof(EntityFrameworkRepository),…和AddRegistratio

我有一个实体读写器的通用实现。我想将这些文件注册到同一个实例。但这失败了,例外情况如下:

中发生“System.InvalidOperationException”类型的异常 mscorlib.dll,但未在用户代码中处理


我认为我们缺少了一些先决条件检查,因为您无法为开放泛型类型创建
Registration
对象。
注册
实例特定于封闭的泛型或非泛型类型。这意味着
CreateRegistration(typeof(EntityFrameworkRepository),…
AddRegistration(typeof(IUnitOfWork),…
都是无效调用

我理解您的意图,您希望在请求期间拥有相同的存储库实例,无论有人将其用作编写器还是读取器,这是显而易见的,因为Simple Injector将抛出异常,告诉您有一个存储库实例

要应用此设计,您必须定义两个通用适配器,从每个通用抽象到通用存储库,如下所示:

internal sealed class EntityFrameworkRepository<TEntity> : IEntityWriter<TEntity>, IEntityReader<TEntity>, IUnitOfWork where TEntity : Entity 
{
     // ...
}
public class EnityWriterAdapter<T> : IEntityWriter<T>
{
    public EntityWriterAdapter(EntityFrameworkRepository<T> repository) { ... }
}

public class EnityReaderAdapter<T> : IEntityReader<T>
{
    public EnityReaderAdapter(EntityFrameworkRepository<T> repository) { ... }
}
public类EnityWriterAdapter:IEntityWriter
{
公共EntityWriterAdapter(EntityFrameworkRepository存储库){…}
}
公共类eNityReader适配器:IEntityReader
{
公共EnityReaderAdapter(EntityFrameworkRepository存储库){…}
}
现在,注册可以如下所示:

container.Register(typeof(EntityFrameworkRepository<>),
    typeof(EntityFrameworkRepository<>), Lifestyle.Scoped);
container.Register(typeof(IEntityWriter<>), typeof(EntityWriterAdapter<>));
container.Register(typeof(IEntityReader<>), typeof(EntityReaderAdapter<>));
container.Register(typeof(EntityFrameworkRepository),
typeof(EntityFrameworkRepository),lifety.Scoped);
容器寄存器(typeof(IEntityWriter),typeof(EntityWriterAdapter));
容器寄存器(类型为(EntityReader),类型为(EntityReaderAdapter));

请注意,我不确定如何处理
IUnitOfWork
注册,因为我不清楚哪个已关闭的
EntityFrameworkRepository
应该被注入到期望
IUnitOfWork
的消费者中。这似乎有些含糊不清。

谢谢Steven,我想我只是为
IUnitOfWork编写了另一个类ToWork
并使用
生活方式显式注册它。Scoped
我只是想将其合并到一个实现中,以实现快速性。对于
容器没有重载。register(typeof(EntityFrameworkRepository),Lifestyle.Scoped);
使用Simple Injector 3.0。5@janhartmann:对不起,您应该使用
注册表(类型、类型、生活方式)
。请参阅我的更新。
public class EnityWriterAdapter<T> : IEntityWriter<T>
{
    public EntityWriterAdapter(EntityFrameworkRepository<T> repository) { ... }
}

public class EnityReaderAdapter<T> : IEntityReader<T>
{
    public EnityReaderAdapter(EntityFrameworkRepository<T> repository) { ... }
}
container.Register(typeof(EntityFrameworkRepository<>),
    typeof(EntityFrameworkRepository<>), Lifestyle.Scoped);
container.Register(typeof(IEntityWriter<>), typeof(EntityWriterAdapter<>));
container.Register(typeof(IEntityReader<>), typeof(EntityReaderAdapter<>));