Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
Entity framework 让Autofac注入已解析的接口类型_Entity Framework_Generics_Domain Driven Design_Autofac - Fatal编程技术网

Entity framework 让Autofac注入已解析的接口类型

Entity framework 让Autofac注入已解析的接口类型,entity-framework,generics,domain-driven-design,autofac,Entity Framework,Generics,Domain Driven Design,Autofac,我在实体框架(EF)中使用领域驱动的设计技术,我的一些类没有公共的无参数构造函数。我有一个服务可以在许多类上工作,其中一些是实体框架,一些是带有公共无参数的DTO 因此,我希望Autofac将已解析的接口类型注入服务ctor,并且我自己处理创建/处理已解析的TInterface类的问题,例如 class MyServiceClass<TInterface> : IMyServiceClass<TInterface> { private Type _classTyp

我在实体框架(EF)中使用领域驱动的设计技术,我的一些类没有公共的无参数构造函数。我有一个服务可以在许多类上工作,其中一些是实体框架,一些是带有公共无参数的DTO

因此,我希望Autofac将已解析的接口类型注入服务ctor,并且我自己处理创建/处理已解析的TInterface类的问题,例如

class MyServiceClass<TInterface> : IMyServiceClass<TInterface>
{
    private Type _classType;

    public MyServiceClass(Type resolvedTypeOfTInterface)
    {
        _classType = resolvedTypeOfTInterface;
    }
}
classmyserviceclass:IMyServiceClass
{
私有类型_classType;
公共MyServiceClass(类型解析TypeoftInterface)
{
_classType=ResolvedTypeofInterface;
}
}
当Autofac解析
IMyServiceClass
时,它会创建一个类型为
MyServiceClass
的类,这很好。但是,我还想找出接口TInterface解析到的类的类型

我知道如何通过直接访问Autofac来获得类,但这意味着直接使用Autofac容器,这听起来不是一个好主意


有谁能建议一种方法,通过在容器构建时设置的某种方法/工厂注入已解决类型的着色面?

在找到可行的答案之前,我尝试了许多方法。问题是泛型类似乎不允许使用某些方法,例如使用Autofac的
ResolvedParameter
。我的答案可能不是最简单的方法,但它是有效的。我的解决方案如下

首先,我更改了MyServiceClass,添加了一个可以设置类型的方法:

class MyServiceClass <TInterface> : IMyServiceClass <TInterface>, ISetType
{
    private Type _classType;

    //normal ctor with any parameters it needs, but NOT including TInterface
    public MyServiceClass(...) {}

    public void SetType(Type resolvedType)
    {
        _classType = resolvedType;
    }
}
classmyserviceclass:IMyServiceClass,ISetType
{
私有类型_classType;
//具有所需任何参数的法线ctor,但不包括TInterface
公共MyServiceClass(…){}
公共void集合类型(类型resolvedType)
{
_classType=resolvedType;
}
}
然后,我添加了以下代码以向Autofac注册
MyServiceClass
类型:

builder.RegisterGeneric(typeof (MyServiceClass<>))
    .As(typeof (IMyServiceClass<>))
    .OnActivating(e =>
    {
        var typeToLookup = e.Instance.GetType().GetGenericArguments()[0];
        var foundEntry =
            e.Context.ComponentRegistry.RegistrationsFor(
               new TypedService(typeToLookup )).SingleOrDefault();
        ((ISetType)e.Instance).SetType(foundEntry.Activator.LimitType);
    });
builder.RegisterGeneric(typeof(MyServiceClass))
.As(类型(IMyServiceClass))
.on正在激活(e=>
{
var typeToLookup=e.Instance.GetType().GetGenericArguments()[0];
var foundEntry=
e、 Context.ComponentRegistry.Registrationfor(
新的TypedService(typeToLookup)).SingleOrDefault();
((ISetType)e.Instance).SetType(foundEntry.Activator.LimitType);
});
这实现了我需要的功能,即,如果我有一个构造函数,其参数类型为
MyServiceClass
,那么在Autofac创建
MyServiceClass
之后,私有字段
\u classType
将包含IMyClass附加到的已解析的类,这就是我想要的


如果您对如何更好地执行此操作有任何意见,我们将不胜感激。

您必须在composition根目录中配置autofac容器。在这种情况下,autofac将处理创建类的操作。您不能让autofac创建该类,而您自己负责创建该类。嗨@Kenneth。我认为我的解释不够清楚,所以我更新了它。基本上我想要的是TInterface类型的类型,而不是实例。我不能让Autofac创建它,因为有时它的构造函数是私有的。我的服务代码可以检查这一点,或者使用
Activator.CreateInstance(type)
创建它,如果它有一个公共的无参数构造函数,或者调用额外的代码来处理给定DDD类的专门工厂。您可以在构造函数内要求
typeof(TInterface)
,不需要注入thatHi@Kenneth。我需要得到解析的类型,例如,如果我提供了IMyClass接口,它应该解析到具有此接口的类,在本例中可能是MyClass。这就是为什么我需要依赖注入框架!我相信这是可以做到的,但我无法从Autofac文档中找到它。如果执行typeof,它将获得当前实例的确切类型。如果您提供了一个接口,那么该类可以与实现该接口的任何类一起使用,因此您无法在其中注入任何内容,因为实现相同接口的其他类仍然可以使用该类。