- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
短版
我有一个使用插件基础结构的应用程序。插件具有可配置的属性,可帮助它们了解如何完成工作。插件按配置文件分组以定义如何完成任务,配置文件存储在由 DataContractSerializer 序列化的 XML 文件中。问题是在读取配置文件时,应用程序反序列化必须了解配置文件中定义的所有插件。我正在寻找一种方法来处理未知插件的解析。请参阅下面提议的解决方案部分,了解我已经考虑实现的一些想法,但我对任何事情都持开放态度(尽管我不想重新发明应用程序)。
详情
lý lịch
我开发了一种业务流程自动化系统,供我目前在 C# 4 中工作的公司内部使用。它详尽地使用了“插件”来定义一切(从要执行的任务到工作单元的定义)并严重依赖动态配置模型,而动态配置模型又依赖 C# 4/DLR 动态对象来完成作业。由于其动态特性,它在执行时有点重,但它始终如一地工作并且性能足以满足我们的需求。
它包括一个 WinForms 配置 UI,该 UI 广泛使用反射来确定插件的可配置属性/字段,以及定义要处理的每个工作单元的属性/字段。 UI 也建立在 BPA 引擎之上,因此它对允许引擎完成其工作的(松散)对象模型有透彻的了解,巧合的是,这导致了一些用户体验的改进,例如,即席作业执行和用户输入的配置时验证。再次有改进的余地,但是,它似乎完成了它的工作。
配置 UI 使用 DataContractSerializer 来序列化/反序列化指定的设置,因此必须在配置加载之前(或在加载时)加载配置引用的任何插件。
结构
BPA 引擎被实现为一个共享程序集 (DLL),它被 BPA 服务(Windows 服务)、配置 UI(WinForms 应用程序)和插件测试器(Windows 服务的控制台应用程序版本)引用。引用共享程序集的三个应用程序中的每一个都只包含执行其特定目的所需的最少量代码。此外,所有插件都必须引用一个非常薄的程序集,该程序集基本上只定义了插件必须实现的接口(interface)。
câu hỏi
由于应用程序中使用了可扩展性模型,因此一直要求配置 UI 与服务应用程序从同一目录(在同一台 PC 上)运行。这样 UI 总是知道服务知道的所有程序集,因此它们可以被反序列化而不会遇到丢失的程序集。现在我们即将推出该系统,出于安全目的,我们的网络管理员要求允许在我们网络中的任何 PC 上远程配置 UI。通常,如果总是有一组已知的程序集要部署,则这不会成为问题,但是,由于能够使用用户构建的程序集扩展应用程序,因此必须有一种方法来解析插件所在的程序集可以实例化/使用。
提议的(可能很明显)解决方案
将 WCF 服务添加到服务应用程序,以允许对该服务实例了解的配置进行典型的 CRUD 操作,并重新设计配置 UI,使其更像具有连接/断开连接模型的 SSMS。这并没有真正解决问题,因此我们还需要从 Service 应用程序公开某种 ServiceContract 以允许查询它知道/有权访问的程序集。这很好而且相当直接,但是问题出现了,“UI 应该什么时候发现服务知道的程序集?”在连接时,我们可以将所有程序集从服务发送到 UI,以确保它始终知道服务执行的所有程序集,但这会因 AppDomain 管理(可能是不必要的)和程序集版本冲突而变得困惑。所以我建议挂入 AppDomain.AssemblyResolve/AppDomain.TypeResolve 事件,只下载客户端还不知道的程序集,并且只在需要时下载。这不一定清除 AppDomain 管理问题,但它肯定有助于解决版本冲突和相关问题。
câu hỏi
如果你一直坚持我这么久,我为你鼓掌并感谢你,但现在我终于要解决这里的实际问题了。经过几个月的研究并最终得出结论,我想知道这里是否有人不得不处理类似的问题,以及您如何处理陷阱和缺点?是否有我完全错过的标准方法来处理这个问题,或者您是否有任何基于您过去如何成功处理这个问题的建议?您是否发现所提议的方法有任何问题,或者您能否提供替代方案?
我知道并不是每个人都生活在我的脑海中,所以如果您需要进一步的澄清/解释,请告诉我。谢谢!
làm mới
我给了 MEF 一个公平的震动,觉得它对我的目的来说太简单了。并不是不能一心一意地处理我的应用程序的插件需求,问题是这样做太麻烦和肮脏而无法实现。这是一个很好的建议,它有很大的潜力,但在目前的状态下,它还没有。
关于我提出的解决方案的任何其他想法或反馈?
làm mới
我不知道我遇到的问题是否过于局部化,是否我未能正确描述我想要实现的目标,或者这个问题是否太长而无法完整阅读;但是我收到的少数答案非常有用,足以帮助我以不同的方式思考问题并找出我所追求的一些缺点。
简而言之,我试图做的是采用三个应用程序,它们在当前状态下使用公共(public)目录结构共享信息(配置/程序集),并尝试使这些应用程序在对可用性和体系结构影响最小的情况下跨网络工作。
文件共享似乎是这个问题的明显答案(正如@SimonMourier 在评论中提出的那样),但使用它们会导致缺乏控制和可调试性 khi出了点问题。我可以将它们视为可行的短期解决方案,但从长远来看,它们似乎并不可行。
1 Câu trả lời
tl;dr,但我 90% 确定您应该查看 MEF .
当我第一次看到它时,我就像“啊,另一个首字母缩略词”,但你会发现它非常简单,并且它内置于 .NET 4 中。最重要的是,它甚至可以在单声道上无缝运行,而且比在听到它和编译 hello worlds 以使用这些功能之间的一个小时(包括咖啡休息时间)。真的就是这么简单。
基本上,您“导出”程序集中的某些内容并将其“导入”到另一个程序集中(全部通过简单的属性修饰),然后您选择搜索它的位置(例如,在应用程序目录、插件文件夹等中)。
biên tập:如果您尝试在配置加载时即时下载和加载(并可能缓存)插件怎么办?
关于c# - 动态装配解析/管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8641799/
#include sử dụng không gian tên std; lớp C{ riêng tư: int giá trị; công khai: C(){ giá trị = 0;
Câu hỏi này đã có câu trả lời: Sự khác biệt giữa char a[] = ?string?; và char *p = ?string?;? là gì? (8 câu trả lời) Đã đóng
đóng cửa. Câu hỏi này cần có thông tin chi tiết hoặc rõ ràng. Hiện tại không chấp nhận câu trả lời. Bạn có muốn cải thiện câu hỏi này không? Thêm chi tiết và làm rõ câu hỏi bằng cách chỉnh sửa bài đăng này. Đã đóng 7 năm trước. Bài viết này đã 8 tháng tuổi
Ngoài việc gỡ lỗi, có công cụ kiểm tra nào cho c, c++ hoặc c# hoạt động giống như sao chép và dán một hàm độc lập vào một hộp văn bản nào đó rồi nhập tham số vào các hộp văn bản khác không? Câu trả lời hay nhất Có lẽ bạn sẽ cân nhắc đến thử nghiệm đơn vị. Tôi khuyên bạn nên dùng Google Test và Google Mock
Tôi muốn di chuyển một cửa sổ (HWND) trên màn hình thứ hai. Vấn đề là tôi đã thử nhiều cách như tăng gấp đôi độ phân giải hoặc nhập giá trị âm nhưng nó vẫn không thể đặt cửa sổ trên màn hình thứ hai của tôi. Bất kỳ manh mối nào về cách thực hiện điều này trong C/C++/C# sẽ hữu ích nhất
Tôi đang tìm kiếm các triển khai hiện có của các loại DES khác nhau trong C/C++/C##. Nền tảng hệ điều hành của tôi là Windows XP/Vista/7. Tôi đang cố gắng viết một chương trình C# có thể mã hóa và giải mã bằng thuật toán DES. Tôi cần một số thực sự
Thật khó để biết nên hỏi gì ở đây. Câu hỏi này mơ hồ, không đầy đủ, quá rộng hoặc mang tính tu từ và không thể trả lời hợp lý theo hình thức hiện tại. Để được trợ giúp làm rõ vấn đề này để có thể mở lại, hãy truy cập trung tâm trợ giúp. Đóng 1
Có cách nào để buộc một cửa sổ khác phải ở trên cùng không? Không phải cửa sổ ứng dụng mà là một cửa sổ khác đang chạy trên hệ thống. (Windows, C/C++/C#) Câu trả lời hay nhất: SetWindowPos(that_window_ha
Giả sử bạn được lựa chọn giữa C/C++ hoặc Csharp và bạn dự định chạy nhiều phiên bản của cùng một máy chủ trên cả máy chủ Windows và Linux, thì lựa chọn thông minh nhất để xây dựng ứng dụng máy chủ socket là gì? Câu trả lời tốt nhất là
Bạn có thể cho tôi biết sự khác biệt giữa chúng không? Nhân tiện, có thứ gì được gọi là thư viện C++ hay thư viện C không? Câu trả lời hay nhất: Thư viện chuẩn C++ và Thư viện chuẩn C là các thư viện được định nghĩa bởi các chuẩn C++ và C và được cung cấp để các chương trình C++ và C sử dụng. Đó là những điểm chung của những từ đó
Mã kiểm tra bên dưới, tôi đưa thông tin đầu ra vào phần bình luận. Tôi đang sử dụng gcc 4.8.5 và Centos 7.2. #include #include lớp C { công khai:
Thật khó để biết câu hỏi ở đây là gì. Câu hỏi này mơ hồ, không rõ ràng, không đầy đủ, quá rộng hoặc mang tính tu từ và không thể trả lời hợp lý theo hình thức hiện tại. Để được trợ giúp làm rõ vấn đề này để bạn có thể mở lại, hãy truy cập trung tâm trợ giúp. Đã đóng
Khách hàng của tôi sẽ giao tiếp với khách hàng khác bằng cách sử dụng một cấu trúc/lớp gọi là annoucement. Tôi nghĩ tôi sẽ viết máy chủ bằng C++. Sẽ có nhiều lớp khác nhau kế thừa annoucement. Vấn đề của tôi là gửi các lớp này qua mạng đến máy khách. Tôi nghĩ có lẽ tôi nên sử dụng
Tôi có hàm sau trong C#: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
Tôi có một dự án trong đó tôi phải viết một hàm để làm gì đó với dữ liệu. Tôi có thể viết mã bằng C/C++ nhưng tôi không muốn chia sẻ mã hàm với công ty của mình. Thay vào đó, tôi chỉ muốn trao cho anh ta quyền gọi hàm đó trong mã của riêng anh ta. Có thể được không? Tôi nghĩ đến hai cách tiếp cận -
Tôi đang sử dụng API của bên thứ 3 (C/C++) được viết kém. Tôi sử dụng nó từ mã được quản lý (C++/CLI). Đôi khi có thể xảy ra "Lỗi vi phạm quyền truy cập". Việc này sẽ làm toàn bộ ứng dụng bị sập. Tôi biết tôi không thể xử lý những lỗi này [nếu con trỏ truy cập vào vị trí bộ nhớ bất hợp pháp, v.v.,
đóng cửa. Câu hỏi này không đáp ứng được hướng dẫn của Stack Overflow. Hiện tại câu hỏi này không chấp nhận câu trả lời. Chúng tôi không chấp nhận những câu hỏi tìm kiếm lời khuyên về sách, công cụ, thư viện phần mềm, v.v. Bạn có thể chỉnh sửa câu hỏi để có thể trả lời bằng các sự kiện và trích dẫn. Đã đóng cửa cách đây 7 năm.
Đã đóng. Câu hỏi này không đáp ứng được hướng dẫn của Stack Overflow. Hiện tại không chấp nhận câu trả lời. Các câu hỏi yêu cầu chúng tôi đề xuất hoặc tìm một công cụ, thư viện hoặc tài nguyên ngoài trang web yêu thích là không phù hợp với Stack Overflow vì
Tôi có một số mã C sẽ được gọi từ C# bằng cách sử dụng P/Invoke. Tôi đang cố gắng định nghĩa một hàm C# tương đương cho hàm C này. SomeData* DoSomething(); cấu trúc SomeData {
Câu hỏi này đã có câu trả lời: Tại sao các cấu trúc này lại sử dụng hành vi không xác định trước và sau khi tăng dần? (14 câu trả lời) Đã đóng 6
Tôi là một lập trình viên xuất sắc, rất giỏi!