Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >VB.NET中具有多个项目的n层体系结构

VB.NET中具有多个项目的n层体系结构
EN

Stack Overflow用户
提问于 2010-03-17 14:15:08
回答 3查看 5K关注 0票数 7

我想就以下情况下使用的最佳方法提出一些建议.

我将有一个Windows应用程序和一个Web应用程序(表示层),它们都将访问公共业务层。业务层将查看配置文件以查找dll (数据层)的名称,它将在运行时创建引用(这是最好的方法吗?)

在运行时创建数据访问层引用的原因是,应用程序将与不同的第三方计费系统进行接口,具体取决于客户端使用的内容。因此,我将有一个单独的数据访问层,以支持每个会计系统。这些可以是单独的安装项目,每个客户端将使用其中一个或另一个,它们不需要在两者之间切换。

项目:

MyCompany.Common.dll -包含接口,所有其他项目都有对此的引用。

MyCompany.Windows.dll - Windows项目,参考MyCompany.Business.dll

MyCompany.Web.dll -网站项目,参考MyCompany.Business.dll

MyCompany.Busniess.dll -业务层,引用MyCompany.Data.* (在运行时)

会计系统的数据层

项目MyCompany.Common.dll将包含所有接口,每个项目都将引用这个接口。

代码语言:javascript
运行
AI代码解释
复制
Public Interface ICompany
    ReadOnly Property Id() as Integer
    Property Name() as String
    Sub Save()
End Interface

Public Interface ICompanyFactory
    Function CreateCompany() as ICompany
End Interface

项目MyCompany.Data.AccountingSys1.dllMyCompany.Data.AccountingSys2.dll将包含如下类:

代码语言:javascript
运行
AI代码解释
复制
Public Class Company
    Implements ICompany

    Protected _id As Integer
    Protected _name As String

    Public ReadOnly Property Id As Integer Implements MyCompany.Common.ICompany.Id
        Get
            Return _id
        End Get
    End Property

    Public Property Name As String Implements MyCompany.Common.ICompany.Name
        Get
            Return _name
        End Get
        Set(ByVal value as String)
            _name = value
        End Set
    End Property

    Public Sub Save() Implements MyCompany.Common.ICompany.Save
        Throw New NotImplementedException()
    End Sub

End Class

Public Class CompanyFactory
    Implements ICompanyFactory

    Public Function CreateCompany() As ICompany Implements MyCompany.Common.ICompanyFactory.CreateCompany
        Return New Company()
    End Function

End Class

项目MyCompany.Business.dll将提供业务规则并从数据层检索数据:

代码语言:javascript
运行
AI代码解释
复制
Public Class Companies

    Public Shared Function CreateCompany() As ICompany
        Dim factory as New MyCompany.Data.CompanyFactory
        Return factory.CreateCompany()
    End Function    

End Class

如有任何意见/建议,将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-17 17:13:47

几点意见。

我将避免使用MyCompany.Common.dll程序集。这些程序通常会被各种不相关的东西填满,然后被更改,通常需要对所有程序集进行重新构建。

我会用应用程序名和公司名称命名您的程序集。MyCompany.MyApplication.Business.dllMyCompany.Business.dll更可取。然后,可以更容易地将应用程序划分为子部分,并从多个应用程序重用代码。

对于您将要拥有的每种类型的实现程序集,最好有单独的契约程序集。就你的情况而言,我建议如下:

代码语言:javascript
运行
AI代码解释
复制
MyCompany.MyApplication.Windows-Contract.dll
MyCompany.MyApplication.Windows.dll

MyCompany.MyApplication.Web-Contract.dll
MyCompany.MyApplication.Web.dll

MyCompany.MyApplication.Business-Contract.dll
MyCompany.MyApplication.Business.dll

MyCompany.MyApplication.Data-Contract.dll
MyCompany.MyApplication.Data.AccountingSys1.dll
MyCompany.MyApplication.Data.AccountingSys2.dll

从您的描述中可以看出,AccountingSys1AccountingSys2程序集共享一个公共契约,因此只有两个实现程序集的一个契约程序集。

契约程序集应该表示您的设计,而不是表示您的实现,并且只因为设计更改而进行更改。您应该避免使用任何“重要”代码(以避免bug),并且应该将代码限制为接口、枚举、异常、属性、事件args和结构--所有这些代码都没有“重要”代码。

在设置程序集引用时,应确保程序集只引用合同程序集,如下所示:

代码语言:javascript
运行
AI代码解释
复制
Data.AccountingSys1
    Data-Contract

Data.AccountingSys2
    Data-Contract

Business
    Business-Contract
    Data-Contract

Windows
    Windows-Contract
    Business-Contract
    Data-Contract (maybe)

Web
    Web-Contract
    Business-Contract
    Data-Contract (maybe)

因此,实现程序集永远不依赖于其他实现程序集。当实现更改时,您只能重新生成一个程序集。

此规则的例外情况是在创建继承层次结构时。例如,您可以创建一个*.Data.AccountingSys.dll来为两个特定的会计系统程序集定义基类。

如果您可以遵循上述所有内容,那么您将需要实现某种依赖注入方法,以便能够从契约程序集中的接口创建对象的实例。您可以使用现有的DI框架,也可以创建包含工厂方法的第三组*-Factory.dll程序集。

这种结构的另一个好处是,单元测试要简单得多,可以基于契约而不是实现,从而帮助您编写干净、可测试的代码。

这可能看起来像很多程序集,但阻止代码创建恶劣的依赖关系所带来的好处将大大减少项目变得过于复杂的可能性,并将有助于提高您的项目的质量。现在稍微痛一下,以后就会消除那么多的痛苦。

票数 5
EN

Stack Overflow用户

发布于 2010-03-17 16:02:31

你的一般做法是合理的:)

您可以考虑将所有接口放在一个独立的程序集(dll)中(严格地说,接口位于业务逻辑和数据访问实现之间--它们应该是唯一能够访问接口的东西),但在可能不是什么大问题的大方案中。

就我个人而言,我有一个共享的工厂方法,它返回一个对象,并在使用时适当地转换它。

票数 1
EN

Stack Overflow用户

发布于 2010-03-17 16:11:12

这是一个很好的方法!我已经在我们的一个工作系统中使用了它,它被证明是可靠的,可以维护,并允许我们在需要时快速添加额外的接口(例如,当我们需要与我们收购的公司的另一个会计系统接口时)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2466293

复制
相关文章
React 钩子:useState()
React 是一个流行的JavaScript库,用于构建用户界面。在 React 16.8 版本中引入了钩子(Hooks)的概念,它为函数组件提供了状态管理和其他功能。本文将着重介绍最常用的钩子之一:useState()。
网络技术联盟站
2023/07/13
4160
React 钩子:useState()
React技巧之将useState作为对象
原文链接:https://bobbyhadz.com/blog/react-type-usestate-object[1]
chuckQu
2022/08/19
9820
美丽的公主和它的27个React 自定义 Hook
在上一篇git 原理中我们在「前置知识点」中随口提到了Hook。其中,就有我们比较熟悉的React Hook。
前端柒八九
2023/10/25
8340
美丽的公主和它的27个React 自定义 Hook
react中的useState源码分析
简单说下为什么React选择函数式组件,主要是class组件比较冗余、生命周期函数写法不友好,骚写法多,functional组件更符合React编程思想等等等。更具体的可以拜读dan大神的blog。其中Function components capture the rendered values这句十分精辟的道出函数式组件的优势。
flyzz177
2022/12/14
5150
换个角度思考 React Hooks
从 Vue 迁移到 React ,不太习惯 React Hooks 的使用?也许换个角度思考 Hooks 出现的意义会对你有所帮助。 1 什么是 Hooks 简而言之, Hooks 是个函数,通过使用 Hooks 可以让函数组件功能更加丰富。 在某些场景下,使用 Hooks 是一个比使用类组件更好的主意。 1.1 Hooks 出现的背景 在 Hooks 出现之前,函数组件对比类组件(class)形式有很多局限,例如: 不能使用 state、ref 等属性,只能通过函数传参的方式使用 props 没有生命周
用户1097444
2022/06/29
4.8K0
换个角度思考 React Hooks
React技巧之具有空对象初始值的useState
原文链接:https://bobbyhadz.com/blog/react-typescript-usestate-empty-object[1]
chuckQu
2022/08/19
1.5K0
react的useState源码分析2
简单说下为什么React选择函数式组件,主要是class组件比较冗余、生命周期函数写法不友好,骚写法多,functional组件更符合React编程思想等等等。更具体的可以拜读dan大神的blog。其中Function components capture the rendered values这句十分精辟的道出函数式组件的优势。
flyzz177
2023/01/04
3550
useState的使用
在 React 的函数式组件当中,是没有状态的,但是使用 React 提供的 Hook 可以让函数式组件拥有状态。
小小杰啊
2022/12/21
6190
React技巧之设置input值
原文链接:https://bobbyhadz.com/blog/react-set-input-value-on-button-click[1]
chuckQu
2022/08/19
2K0
React技巧之设置input值
React 中的 useState() 是什么?
在 React 中,useState() 是一个用于在函数组件中声明状态的 Hook。它是 React 16.8 引入的一种新的状态管理方式。
王小婷
2023/09/15
7640
教你如何在 React 中逃离闭包陷阱 ...
众所周知,JavaScript 中的闭包(Closures)一定是这种语言最可怕的特性之一,即使是无所不知的 ChatGPT 也是这样说的。另外它可能也是最隐蔽的语言特性之一,我们在编写 React 代码时经常会用到它,但是大多数时候我们甚至没有意识到这一点。但是,我们终究还是离不开它:如果我们想编写复杂且性能很好的 React 应用,就必须了解闭包。所以,今天我们一起来学习以下几点:
ConardLi
2023/09/11
7700
教你如何在 React 中逃离闭包陷阱 ...
使用React hooks处理复杂表单状态数据
自从React hooks发布以来已经有一段时间了,我很喜欢这个特性。这个hooks把我勾上了!
前端知否
2020/03/23
3.4K0
使用React hooks处理复杂表单状态数据
超性感的React Hooks(三):useState
这几天和许多同学聊了使用React Hooks的感受。总体感觉是,学会使用并不算难,但能用好却并不简单。
用户6901603
2020/07/23
2.4K0
为什么 React Hooks useState 更新不符预期?
不合预期的更新 在定时器中,用useState使数字0做每1秒递增1,但结果不合预期:数字增加一次后便不再改变? Counter.js // Counter.js import React, { us
前端老王
2020/09/14
1.7K0
30分钟精通React今年最劲爆的新特性——React Hooks
你还在为该使用无状态组件(Function)还是有状态组件(Class)而烦恼吗? ——拥有了hooks,你再也不需要写Class了,你的所有组件都将是Function。
桃翁
2018/12/14
2K0
React源码中的useState,useReducer
大家都知道hooks是在函数组件的产物。之前class组件为什么没有出现hooks这种东西呢?
goClient1992
2022/12/07
1K0
React useReducer 终极使用教程
useReducer 是在 react V 16.8 推出的钩子函数,从用法层面来说是可以代替useState。相信前期使用过 React 的前端同学,大都会经历从 class 语法向 hooks 用法的转变,react 的 hooks 编程给我们带来了丝滑的函数式编程体验,同时很多前端著名的文章也讲述了 hooks 带来的前端心智的转变,这里就不再着重强调,本文则是聚焦于 useReducer 这个钩子函数的原理和用法,笔者带领大家再一次深入认识 useReducer。
蒋川@卡拉云
2022/08/31
3.8K0
React useReducer 终极使用教程
React Hooks vs React Component
是不是简单多了!可以看到, Example变成了一个函数,但这个函数却有自己的状态(count),同时它还可以更新自己的状态(setCount)。这个函数之所以这么了不得,就是因为它注入了一个hook– useState,就是这个hook让我们的函数变成了一个有状态的函数。
javascript.shop
2019/09/04
3.4K0
React Hooks vs React Component
使用Immer解决React对象深度更新的痛点
最近接到一个需求,修改一个使用React编写的工单系统,具体就是在创建工单的时候能配置一些增强工单通用性的功能然后把配置传给后端进行存储,乍一听其实挺简单,但是由于数据结构没设计好,写的时候非常的麻烦。
Jou
2023/09/06
1.1K0
使用Immer解决React对象深度更新的痛点
宝啊~来聊聊 9 种 React Hook
文章会为你讲述 React 9种 Hook 的日常用法以及进阶操作,从浅入深彻底掌握 React Hook!
19组清风
2022/02/28
1.1K0
宝啊~来聊聊 9 种 React Hook

相似问题

React useState钩子-更新对象的状态

227

使用useState钩子更新函数后,React不会更新状态

120

使用React中的useState钩子更新对象

10

React钩子useState不更新状态

324

如何使用useState钩子更新对象状态

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档