.net WCF和类库
我们通过WCF提供服务。SQL Server中的数据是使用实体框架、Automapper和DTO公开的 我们很乐意在DTO中提供属性,但不确定如何实现我们希望保存在类库中的其他方法 与将整个服务的所有方法放在单个WCF服务实现中不同,我们只想引用在类库中实现的方法 我们如何通过类库实现业务逻辑层,通过WCF向表示层公开,并使用DTO传递数据 公开的类方法是如何引用DTO的?类库应该按层划分吗 服务要素.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
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?”