Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.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
.net WCF和类库_.net_Wcf_Entity Framework_Dto - Fatal编程技术网

.net WCF和类库

.net WCF和类库,.net,wcf,entity-framework,dto,.net,Wcf,Entity Framework,Dto,我们通过WCF提供服务。SQL Server中的数据是使用实体框架、Automapper和DTO公开的 我们很乐意在DTO中提供属性,但不确定如何实现我们希望保存在类库中的其他方法 与将整个服务的所有方法放在单个WCF服务实现中不同,我们只想引用在类库中实现的方法 我们如何通过类库实现业务逻辑层,通过WCF向表示层公开,并使用DTO传递数据 公开的类方法是如何引用DTO的?类库应该按层划分吗 服务要素 public class Class1 : Interface1 { public C

我们通过WCF提供服务。SQL Server中的数据是使用实体框架、Automapper和DTO公开的

我们很乐意在DTO中提供属性,但不确定如何实现我们希望保存在类库中的其他方法

与将整个服务的所有方法放在单个WCF服务实现中不同,我们只想引用在类库中实现的方法

我们如何通过类库实现业务逻辑层,通过WCF向表示层公开,并使用DTO传递数据

公开的类方法是如何引用DTO的?类库应该按层划分吗

服务要素

public class Class1 : Interface1
{
    public Class1 GetClass1(int id) { 
        // implementation

    }
}

public class Class2 : Interface1
{
    public Class2 GetClass2(int id)
    {
        // implementation

    }

}
[服务合同]

public interface Interface1
{
    [OperationContract]
    Class1 GetClass1(int id);

    [OperationContract]
    Class2 GetClass2(int id);
}
类库元素

public class Class1 : Interface1
{
    public Class1 GetClass1(int id) { 
        // implementation

    }
}

public class Class2 : Interface1
{
    public Class2 GetClass2(int id)
    {
        // implementation

    }

}
DTO

[DataContract]
public class Class1
{
    [DataMember]
    public int x { get; set;}
}

[DataContract]
public class Class2
{
    [DataMember]
    public int y { get; set;}
}

如果我没弄错你的问题。你不希望所有的方法都被公开。如果您只想抽象几个方法,那么您必须在服务和类服务中共享公共DTO。

是的,您可以为WCF服务使用类库(Visual Studio中的WCF for WCF类库下有一个项目)。这个类库将保存服务契约的实现——服务契约也可以在类库中定义,或者可以在类库引用的另一个程序集中定义

然后,该类库又需要托管(IIS、自托管或Windows服务)。我们在工作中这样做——我们有一个n层应用程序,它使用WCF在层之间进行通信,所有服务本身都在类库中实现并托管(通常在IIS中,有一种情况是在Windows服务中)

通过修改发布代码的版本(实现类和DTO时应该有不同的名称),您可以执行以下操作:

baseAddress = new Uri("some address");

ServiceHost myHost = new ServiceHost(typeof(Service1), baseAddress);

myHost.Open();
<%@ ServiceHost Language="C#"
                Service="MyCompany.Service1"
                Factory="System.ServiceModel.Activation.ServiceHostFactory" %>
类库

[ServiceContract]
public interface Interface1
{
    [OperationContract]
    Class1 GetClass1(int id);

    [OperationContract]
    Class2 GetClass2(int id);
}


public class Service1 : Interface1
{
    public Class1 GetClass1(int id) 
    { 
        // implementation
    }

    public Class2 GetClass2(int id)
    {
        // implementation
    }
}
请注意,有一个服务类,它实现服务定义(
Interface1
)中定义的两个操作契约。您发布的代码不会编译,因为两个类都没有实现接口中定义的两个方法(由于它们的返回类型,您至少会在类名上得到警告)

然后,可以将对此类库的引用添加到DTO(
Class1
Class2
)所在的程序集中

要在自托管方案或Windows服务中承载此功能,您需要对类库的引用(
Service1
,在我的示例中)以及对DTO程序集的引用。然后,您将为该服务实例化一个服务主机,如下所示:

baseAddress = new Uri("some address");

ServiceHost myHost = new ServiceHost(typeof(Service1), baseAddress);

myHost.Open();
<%@ ServiceHost Language="C#"
                Service="MyCompany.Service1"
                Factory="System.ServiceModel.Activation.ServiceHostFactory" %>
要在IIS中承载,您需要修改.svc文件标记,如下所示:

baseAddress = new Uri("some address");

ServiceHost myHost = new ServiceHost(typeof(Service1), baseAddress);

myHost.Open();
<%@ ServiceHost Language="C#"
                Service="MyCompany.Service1"
                Factory="System.ServiceModel.Activation.ServiceHostFactory" %>

您需要使用完整的名称空间完全限定服务名称,因此假设
Service1
的名称空间是
MyCompany
,则完全限定的名称是
MyCompany.Service1

最后,您需要将相关的
system.serviceModel
部分放在相应的托管应用程序的app.config或web.config文件中,因为库使用的是其消费应用程序的配置文件,而不是它们自己的配置文件

在这个主题上有许多细微的变化(在我们的例子中,我们使用自定义服务主机和自定义服务主机工厂,接口-服务契约-在一个单独的程序集中,这允许我们通过
ChannelFactory
创建代理)

要回答您的最后一个问题,请访问类库如果要使用DTO,则必须引用包含DTO的程序集,并且您可以按照自己的要求拆分服务类库—如果您有多个应用程序,我肯定会至少按层拆分,也可能按垂直堆栈拆分。

首先让我澄清一下是什么(我认为)你正在努力做到:

您希望通过WCF公开一些业务逻辑,这些逻辑最终将由您的表示层使用。业务逻辑涉及访问数据库和使用ORM和AutoMapper。就您的问题而言,我相信此实现的细节与此无关

让我们进行第一次迭代,看看会是什么样子(我会将不同的名称空间分离到不同的程序集中):

名称空间契约
{
[服务合同]
公共接口IMyService
{
[经营合同]
数据GetData(int-id);
}
[数据合同]
公共类数据
{
[数据成员]
公共字符串PropertyValue{get;set;}
}
}
命名空间类库
{
公共类BusinessLogicImplementation:IMyService
{
公共数据GetData(int-id)
{
/**
*在此处执行数据检索,返回返回的数据
* */
数据模型返回数据;
返回Mapper.Map(returnedData);
}
}
}
命名空间EntityFrameworkModel
{
公共类数据模型
{
公共字符串PropertyValue{get;set;}
}
}
Contracts程序集包含对服务和客户端都是公共的数据。客户端可以通过对程序集的二进制引用或拥有自己的本地契约实现(如Visual Studio服务引用)的客户端使用这些数据

类库程序集包含数据检索和业务逻辑的实现。我还展示了数据模型-但仅用于额外的上下文-我认为这与您的问题无关:

到目前为止,我们已经回答了您的部分问题:

“我们如何通过类库实现业务逻辑层,通过WCF向表示层公开,并使用DTO传递dat?”