Fluxor または C# Dependency Injection に精通している誰かが、私が数日間苦労してきた問題を解決してくれませんか。
Blazor コンポーネント内で Fluxor を使用する場合は、次を含めてアクションを発生させます。
@Inherits Blazor.Fluxor.Components.FluxorComponent
@Inject IDisptacher dispatcher
これにより、次のようにコンポーネント内でアクションを発生させることができます Dispatcher.Dispatch(new MyAction(MyParameter))
。
Blazor コンポーネントから Fluxor アクションをディスパッチすることに加えて (これはうまく機能しています)、.cs ファイルの通常のクラスからアクションをディスパッチできる必要があります。次の TestClass に示すようにインジェクションを試しましたが、ヒットすると aNullReferenceException
が発生しDispatcher.Dispatch
ます。
using Fluxor;
using Microsoft.AspNetCore.Components;
namespace ICET.Store
{
public class TestClass
{
[Inject]
private IDispatcher Dispatcher { get; set; }
public void onMessage()
{
// Other code removed
Dispatcher.Dispatch(new LoggedInAction(phoneNumber));
}
}
}
明らかに何かで宣言された Dispatcher をインスタンス化するprivate IDispatcher Dispatcher { get; set; }
必要がありますが、次のように Startup.cs でインスタンス化が行われたと思いました。
services.AddFluxor(options =>
{
options.UseDependencyInjection(typeof(Startup).Assembly)
{);
明らかに、ここで何かが欠けていますが、それが何であるかに困惑しています。通常の .cs ファイルに含まれるクラス内で Fluxor アクションを発生させる方法について、誰かがガイダンスを教えてくれますか? ありがとう。
Peter Morris の提案に従ってコンストラクター インジェクションを使用して、テスト クラスを次のように変更しました。
public class TestClass
{
IDispatcher _dispatcher;
public TestClass(IDispatcher dispatcher)
{
_dispatcher = dispatcher;
}
public void onMessage()
{
// Other code removed
_dispatcher.Dispatch(new LoggedInAction());
}
}
ただし、現在苦労しているのは、クラスをインスタンス化するときに、TestClass コンストラクターに渡すことができる Fluxor Disptacher への参照を取得するにはどうすればよいですか? Fluxorはサービスとして実装されていると思いました。
services.AddFluxor(options =>
{
options.UseDependencyInjection(typeof(Startup).Assembly)
{);
...それは、何らかの形でグローバルに参照できるようになっています。
次の更新...
私の TestClass は、インターフェイスを実装するように変更され、Startup.cs にスコープ サービスとして登録されました。
public interface ITestClass
{
public void InitiateAction();
}
public class TestClass : ITestClass
{
IDispatcher _dispatcher;
public TestClass(IDispatcher dispatcher)
{
_dispatcher = dispatcher;
}
public void InitiateAction()
{
_dispatcher.Dispatch(new LoggedInAction("123456"));
}
}
Startup.cs
services.AddScoped<ITestClass, TestClass>();
これらの変更の結果として、TestClass がインスタンス化され、そのInitiateAction
メソッドを呼び出してアクションをディスパッチできると予想していました。ただし、次のコードでは頑固に null のままです。
class DeviceListener : Cometd.Bayeux.Client.IMessageListener
{
private readonly IDispatcher _dispatcher;
private ITestClass _testClass;
public void onMessage(Cometd.Bayeux.Client.IClientSessionChannel mChannel, Cometd.Bayeux.IMessage message)
{
_testClass.InitiateAction();
}
更新 ... 私の DeviceListener クラスは、Cometd.Bayeux.Client.IMessageListener インターフェースを実装し、非送信請求メッセージがサーバー プロセスから受信されたときに実行される Callback を定義します。Startup.cs で参照されています。
listener = mClient.getChannel("/v2/me/devices");
listener.subscribe(new GWS.DeviceListener());
クラスは次のように構成されています。
class DeviceListener : Cometd.Bayeux.Client.IMessageListener
{
private readonly IDispatcher _dispatcher;
public DeviceListener(IDispatcher dispatcher)
{
_dispatcher = dispatcher;
}
public void onMessage(Cometd.Bayeux.Client.IClientSessionChannel mChannel, Cometd.Bayeux.IMessage message)
{
_dispatcher.Dispatch(new LoggedInAction("12345");
}
}
上記の DeviceListener にすべて示されていますが、 内から Fluxor アクションをディスパッチできるようにしたいと考えていますonMessage
。
上記の DeviceListener はパラメーター化されたコンストラクターを示していますが、実際にlistener.subscribe(new GWS.DeviceListener());
は Startup.csで引数のコンパイル エラーが発生します。