Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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#_.net_Generics_Interface_Autofac - Fatal编程技术网

C# 在另一个具有约束的通用接口中使用接口赢得';不编译

C# 在另一个具有约束的通用接口中使用接口赢得';不编译,c#,.net,generics,interface,autofac,C#,.net,Generics,Interface,Autofac,我已经为我的服务层构建了一个通用数据转换器,现在我正在尝试构建接口,以便可以使用依赖项注入(Autofac)进行绑定。但是,我无法获得编译注入所需的最终接口。我构建了一个简单的示例,我在下面列出: public interface IMyData { int I { get; set; } } public class MyData : IMyData { public int I { get; set; } } public interface IMyDto { i

我已经为我的服务层构建了一个通用数据转换器,现在我正在尝试构建接口,以便可以使用依赖项注入(Autofac)进行绑定。但是,我无法获得编译注入所需的最终接口。我构建了一个简单的示例,我在下面列出:

public interface IMyData
{
    int I { get; set; }
}

public class MyData : IMyData
{
    public int I { get; set; }
}

public interface IMyDto
{
    int J { get; set; }
}

public class MyDto : IMyDto
{
    public int J { get; set; }
}

public class MyService<TData, TDto> : IMyService<TData, TDto>
    where TData : class, new()
    where TDto : GenericDto<TData, TDto>, new()
{
    public TDto DoSomething(TData data)
    {
        return new TDto();
    }
}

public interface IMyService<in TData, out TDto>
    where TData : class, new()
    where TDto : GenericDto<TData, TDto>, new()
{
    TDto DoSomething(TData data);
}

public class TryToUse
{

    private MyService<MyData, MyDto> actualServiceActualClasses;         //OK

    private IMyService<MyData, MyDto> interfaceServiceActualClasses;     //OK

    //fails with two messages, both the same for IMyData and IMyDto
    //'TryGenericInterfaces.IMyDto' must be a non-abstract type with a public
    //parameterless constructor in order to use it as parameter 'TDto' in the 
    //generic type or method 'TryGenericInterfaces.IMyService<TData,TDto>'

    private IMyService<IMyData, IMyDto> interfaceServiceInterfaceClasses; //fails
}
公共接口IMyData
{
int I{get;set;}
}
公共类MyData:IMyData
{
公共整数I{get;set;}
}
公共接口IMyDto
{
int J{get;set;}
}
公共类MyDto:IMyDto
{
公共int J{get;set;}
}
公共类MyService:IMyService
其中TData:class,new()
其中TDto:GenericDto,new()
{
公共TDto剂量测定(TData数据)
{
返回新的TDto();
}
}
公共接口IMyService
其中TData:class,new()
其中TDto:GenericDto,new()
{
TDto剂量测定(TData数据);
}
公共类试用
{
private MyService ActualServiceActualClass;//确定
私有IMyService InterfaceServiceActualClass;//确定
//失败,出现两条消息,IMyData和IMyDto的消息都相同
//“TryGenericInterfaces.IMyDto”必须是具有公共
//无参数构造函数,以便将其用作
//泛型类型或方法“TryGenericInterfaces.IMyService”
私有IMyService interfaceServiceInterfaceClasses;//失败
}
您将看到,我已将编译时错误嵌入到有问题的声明之上。不用说,这是依赖注入工作所需的最终声明(也是因为我无论如何都想声明它)

这是接口的限制,还是我只是错过了什么

更新

感谢@D Stanley和其他人指出我的误解。我想你们可以看到我正在尝试做的,就是构建一个通用的数据到DTO和DTO到数据转换器。在AutoMapper的帮助下,代码运行良好。(我已经更新了代码,以包含每个DTO继承的GenericDto)


这个问题没有经过深思熟虑,对此我很抱歉。我已经提供了一个与你们一致的答案,也解释了我最终想要实现的目标(实际上现在已经实现了)

错误似乎很明显-您已指定
TData
TDto
必须是具有无参数构造函数的类,但您正在尝试使用接口(既不是类也没有构造函数)作为泛型参数。除非您可以删除
类new()
限制,否则我看不到这一点

这样行吗

public interface IMyService<in TData, out TDto>
    where TData : IMyData
    where TDto : IMyDto
{
    TDto DoSomething(TData data);
}
公共接口IMyService
其中TData:IMyData
TDto的位置:IMyDto
{
TDto剂量测定(TData数据);
}

公共类MyService:IMyService
其中TData:class,IMyData,new()
其中TDto:class,IMyDto,new()
{
公共TDto剂量测定(TData数据)
{
返回新的TDto();
}
}

错误似乎很明显-您已指定
TData
TDto
必须是具有无参数构造函数的类,但您正在尝试使用接口(既不是类也没有构造函数)作为泛型参数。除非您可以删除
类new()
限制,否则我看不到这一点

这样行吗

public interface IMyService<in TData, out TDto>
    where TData : IMyData
    where TDto : IMyDto
{
    TDto DoSomething(TData data);
}
公共接口IMyService
其中TData:IMyData
TDto的位置:IMyDto
{
TDto剂量测定(TData数据);
}

公共类MyService:IMyService
其中TData:class,IMyData,new()
其中TDto:class,IMyDto,new()
{
公共TDto剂量测定(TData数据)
{
返回新的TDto();
}
}

错误似乎很明显-您已指定
TData
TDto
必须是具有无参数构造函数的类,但您正在尝试使用接口(既不是类也没有构造函数)作为泛型参数。除非您可以删除
类new()
限制,否则我看不到这一点

这样行吗

public interface IMyService<in TData, out TDto>
    where TData : IMyData
    where TDto : IMyDto
{
    TDto DoSomething(TData data);
}
公共接口IMyService
其中TData:IMyData
TDto的位置:IMyDto
{
TDto剂量测定(TData数据);
}

公共类MyService:IMyService
其中TData:class,IMyData,new()
其中TDto:class,IMyDto,new()
{
公共TDto剂量测定(TData数据)
{
返回新的TDto();
}
}

错误似乎很明显-您已指定
TData
TDto
必须是具有无参数构造函数的类,但您正在尝试使用接口(既不是类也没有构造函数)作为泛型参数。除非您可以删除
类new()
限制,否则我看不到这一点

这样行吗

public interface IMyService<in TData, out TDto>
    where TData : IMyData
    where TDto : IMyDto
{
    TDto DoSomething(TData data);
}
公共接口IMyService
其中TData:IMyData
TDto的位置:IMyDto
{
TDto剂量测定(TData数据);
}

公共类MyService:IMyService
其中TData:class,IMyData,new()
其中TDto:class,IMyDto,new()
{
公共TDto剂量测定(TData数据)
{
返回新的TDto();
}
}

对不起,我犯了个愚蠢的错误。我不知道我昨天抽的是什么,但睡了个好觉后,我现在更清楚了

@rhughes指出(参见下面的注释)正是new()约束阻止了泛型定义获取接口,这是一个很好的建议。我确实尝试过,但实体框架(EF)不能与接口()一起工作,所以我在泛型定义中使用了真实的类,即

private IMyService<MyData, MyDto>
private IMyService
要将我的通用服务用于EF,我必须放松我的设计目标,即只在层之间传递接口。然而,总的来说,通用服务的好处以及类通常只是数据的事实意味着我可以放松我的规则