私のxamarinフォームプロジェクトでプリズムを使用しています。ビューモデルに依存性注入(コンストラクタインジェクション)を問題なく使用できました。 (バックグラウンドで長時間実行されるタスクをプッシュするバックグラウンドサービス)バックグラウンドサービスに依存関係を注入する方法インターフェイスオブジェクトをコンストラクタ(SyncingBackgroundingCode)のパラメータとして渡すと、オブジェクト(SqliteService)がnullになります。依存性注入コンテナ内のオブジェクトを登録して解決しました。 このケースを処理するにはどうすればよいですか?このシナリオを実装するための例やリンクを誰かから提供できますか?プリマを使用したXamarinフォームの依存サービスの実装
これは、依存関係注入を実装しようとしているコードの一部です。
This is in Droid :-
public class AndroidSyncBackgroundService : Service
{
CancellationTokenSource _cts;
public override IBinder OnBind (Intent intent)
{
return null;
}
public override StartCommandResult OnStartCommand (Intent intent, StartCommandFlags flags, int startId)
{
_cts = new CancellationTokenSource();
Task.Run (() => {
try {
//INVOKE THE SHARED CODE
var oBackground = new SyncingBackgroundingCode();
oBackground.RunBackgroundingCode(_cts.Token).Wait();
}
catch (OperationCanceledException)
{
}
finally {
if (_cts.IsCancellationRequested)
{
var message = new CancelledTask();
Device.BeginInvokeOnMainThread (
() => MessagingCenter.Send(message, "CancelledTask")
);
}
}
}, _cts.Token);
return StartCommandResult.Sticky;
}
public override void OnDestroy()
{
if (_cts != null) {
_cts.Token.ThrowIfCancellationRequested();
_cts.Cancel();
}
base.OnDestroy();
}
}
This is in PCL:-
public class SyncingBackgroundingCode
{
public SQLiteConnection _sqlconnection;
SqliteCalls oSQLite = new SqliteCalls();
ISqliteService _SqliteService;
public SyncingBackgroundingCode(ISqliteService SqliteService)
{
//object is null
}
public async Task RunBackgroundingCode(CancellationToken token)
{
DependencyService.Get<ISQLite>().GetConnection();
await Task.Run (async() => {
token.ThrowIfCancellationRequested();
if (App.oSqliteCallsMainLH != null)
{
App.bRunningBackgroundTask = true;
oSQLite = App.oSqliteCallsMainLH;
await Task.Run(async() =>
{
await Task.Delay(1);
oSQLite.ftnSaveOnlineModeXMLFormat("Offline", 0);
oSQLite.SyncEmployeeTableData();
oSQLite.SaveOfflineAppCommentData();
oSQLite.SaveOfflineAdditionToFlowData();
await Task.Delay(500);
var msgStopSyncBackgroundingTask = new StopSyncBackgroundingTask();
MessagingCenter.Send(msgStopSyncBackgroundingTask, "StopSyncBackgroundingTask");
});
}
}, token);
}
}
おそらくDependencyService.Get()コンテナは、サービスを登録する機会を持って前に呼び出された可能性があります。正しい順序でトリガーされていることを確認してください。それ以外の場合は、サービスが解決されない理由はありません。また、アセンブリに[assembly:Dependency(typeof(SQLitService))]を使用してサービスを登録することをお勧めします。これにより、コードが解決される前にサービスが常に登録されます。 –