0

クラス:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerSession)]
public class MainService : IChat
{
    IChatCallback ChatCallback = OperationContext.Current.GetCallbackChannel<IChatCallback>();
    Chat chat = new Chat(this);
    public void ShowChat()
    {
        chat.Show();
    }
    public void SendInstantMessage(string user, string message)
    {
        chat.RaiseMsgEvents(user, message);
        ChatCallback.InstantMessage(user, message);
    }
 }

形:

public partial class Chat : Form
{
    MainService service;

    public Chat(MainService service)
    {
        InitializeComponent();
        OnMsgReceivedEvent += new OnMsgReceived(callback_OnMsgReceivedEvent);
        this.service = service;
    }

    private void btnSend_Click(object sender, EventArgs e)
    {
        service.SendInstantMessage("Admin", txtMsg.Text);
    }
 }

mainForm は次のようにクラスを使用します。

 public partial class Form1 : Form
 {
    ServiceHost host;
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        host = new ServiceHost(typeof(WCF_Server.MainService));
        host.Open();
    }
 }

メインフォームでは、初期化せずにクラスを渡すだけですが、クラスでShowChat()呼び出されたときにチャットフォームを表示し、このクラスメソッドにアクセスしてメッセージを送信できるようにする必要があります。

4

3 に答える 3

1

.NET はオブジェクト指向言語です。実際、すべてのクラスはオブジェクトです。

エラーが発生するのは、グローバル レベルで「this」を使用してオブジェクトをインスタンス化しているためです。

アップデート

更新に基づいて、次のことができ、動作します。ビジネスルールなどに違反しないように、これをもう少しリファクタリングすることをお勧めします。

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerSession)]
public class MainService : IChat
{
    IChatCallback ChatCallback = OperationContext.Current.GetCallbackChannel<IChatCallback>();
    //Changed this to be just a declaration. This will be null,
    // as there is no object yet, this is really just a pointer to nothing.
    //This tells the system that you might/are planning to use an object called 
    //chat, but it doesn't exist yet.
    Chat chat;

    // Get your default constructor going. This will create the actual chat object, allowing the rest of your class to access it.
    public MainService()
    {
         //instantiate it! (or as some of our co-ops say "We're newing it")
         chat = new Chat(this);
    }

    //now that chat is actually instantiated/created you can use it.
    public void ShowChat()
    {
        chat.Show();
    }
    public void SendInstantMessage(string user, string message)
    {
        chat.RaiseMsgEvents(user, message);
        ChatCallback.InstantMessage(user, message);
    }
 }

これは単なる個人的な不満ですが、関数パラメーターをグローバル変数と同じ名前にすることは...まあ、私にとってはノーノーです。Chat.Chat(MainService) 関数でこれに気付きました。

于 2012-05-09T16:05:57.243 に答える
0

もちろん、このクラスのクラスをパラメーターとして受け取るメソッドを作成し、それを呼び出すだけです...

于 2012-05-09T16:00:36.297 に答える
0

他の投稿が示唆しているように、クラスchat内でフィールドをインスタンス化する方法を再検討する必要があります。exampleプロパティの遅延読み込みを検討します...

private ChatForm _Chat = null;
private ChatForm Chat
{
    get
    {
        if (this._Chat == null)
        {
            this._Chat = new ChatForm(this);
        }
        return this._Chat;
    }
    set { this._Chat = value; }
}

遅延読み込みを使用するとthis、リクエストに応じてキーワードを使用できるようになります。

于 2012-05-09T16:06:25.343 に答える