1

我有 2 个完全独立的项目,一个在 vb 中,一个在 c# 中

项目 A - VB

项目 B - C#

我们有一个场景,项目 A 中的代码当前正在使用项目 B 中的代码,例如

项目A

Public Class SMS
    Public Sub New()

    End Sub

    Public Function SendSMS() As String
        Return "SMS Sent "
    End Function
End Class

项目 B

using ProjectA;
    public class Email
    {      
        public string SendEmail()
        {
        return "Email Sent ";
        }

        public string SendEmail(SMS sms)
        {
            sms.SendSMS();
            return "Email Sent ";
        }
    }

这工作正常但是我们现在需要从项目 A 发送一封电子邮件,这将创建一个循环引用在这里阅读大量帮助后,我创建了一个界面并在项目 a 中使用了该界面:

项目 C

Public Class Interface
    Public Interface IEmail
        Sub SendEmail()
    End Interface
End Class

我已经在电子邮件上实现了界面并将项目 A更改为:

Public Function SendSMS(ByVal tEmail As IEmail) As String
    tEmail.SendEmail()
    Return "SMS Sent "
End Function

从我的用户界面可以正常工作,因为我可以实例化对象并且一切正常。但是我遇到了一个问题,我不想在 UI 中实例化对象,而是在项目 A

Public Sub SendSMSAndEMail()
    Dim temail As New email
    Me.SendSMS(temail)
End Sub

我遇到了真正的路障?我想我应该看一个工厂班,但我对如何最好地实现这一点感到困惑?

注意更多信息:

如果我们要再次设计系统,项目 A 和项目 B 将在同一个项目(和语言)中,这不会导致问题。事实上,我们有 2 个 UI 的一个控制台服务器应用程序和一个 Win 表单 UI。项目 B 最初用于控制台应用程序,并使用主要 Win 窗体应用程序使用的各种功能。现在出现了控制台应用程序中有我们需要从主应用程序中获得的代码,例如发送电子邮件的能力,但是代码很难从控制台应用程序中提取,因为它与主应用程序使用不同的语言应用。

4

1 回答 1

0

邪恶的解决方案:静态工厂函数

在您的根项目中声明这个静态类(接口项目中的示例)。

public static class EmailFactory{
    public static Func<IEmail> Create{ get;set; }
}

然后在您的 UI 中(我假设您的项目最终将在 UI 中启动),将其设置为:

EmailFactory.Create = new Func<IEmail>( () => { return new ProjectB.Email() } );

这样您就可以从项目 A 中静态使用它(即使您仍然需要从 UI 中执行它)。

但是忘记它,你不需要它。或者至少,不要使用它。

如果你这么说

SMS消息的当前发送过程在项目A中处理。

是不是意味着A项目可以直接执行?我希望不是。正在执行的图书馆对我来说有点邪恶。如果可以,请在单独的项目中执行,该项目也可以引用项目 A 和 B。如果是这样,那么您interface approach已经满足要求。

编辑:

看起来项目 A 或 B 本身处于 UI 级别。在 UI 项目中包含库代码是一个糟糕的设计。然而,重构整个应用程序需要几个月的时间。

我可以建议的是创建一个库层,需要在项目之间交互使用。所以架构应该是:

     infrastructure
           |
           |
        library
        /     \
       /       \
[Project A]  [Project B]

恕我直言,这是解决您的问题的唯一方法。

于 2013-05-21T11:10:54.920 回答