0

カスタム追跡参加者があります:

public class ErsTrackingParticipant : TrackingParticipant, IErsTrackingParticipant
{
    private readonly INHibernateRepository<ErsTrackingRecord> _ersTrackingRecordRepository;

    public ErsTrackingParticipant(INHibernateRepository<ErsTrackingRecord> ersTrackingRecordRepository)
    {
        this._ersTrackingRecordRepository = ersTrackingRecordRepository;
    }

    protected override void Track(TrackingRecord record, TimeSpan timeout)
    {
        ErsTrackingRecord ersTrackingRecord = TrackingCommand.GetTrackingRecord(record);
        this._ersTrackingRecordRepository.Save(ersTrackingRecord);
    }
}

public interface IErsTrackingParticipant
{
}

およびワークフロー ホスト ヘルパー:

public class WorkflowHostHelper: IWorkflowHostHelper
{
    private WorkflowApplication _workflowApplication;
    AutoResetEvent _instanceUnloaded = new AutoResetEvent(false);

    private IErsTrackingParticipant _ersTrackingParticipant;

    private bool _isCompleted = false;

    public string InstanceStoreConnectionString { get { return ConfigurationManager.AppSettings["InstanceStoreConnectionString"]; } }

    public WorkflowHostHelper(IErsTrackingParticipant ersTrackingParticipant)
    {
        _ersTrackingParticipant = ersTrackingParticipant;
    }

    public void Initialize(Activity workflowType)
    {
        _workflowApplication = new WorkflowApplication(workflowType);
        TrackingProfile trackingProfile = new TrackingProfile() { Name = "TroubleshootingProfile", ActivityDefinitionId = "*" };
        trackingProfile.Queries.Add(new WorkflowInstanceQuery { States = { "*" } });
        trackingProfile.Queries.Add(new ActivityStateQuery { States = { "*" } });
        trackingProfile.Queries.Add(new ActivityScheduledQuery());
        trackingProfile.Queries.Add(new BookmarkResumptionQuery() { Name = "*" });

        _workflowApplication.Extensions.Add(_ersTrackingParticipant);

        SynchronizationContext synchronizationContext = SynchronizationContext.Current;
        _workflowApplication.SynchronizationContext = synchronizationContext;
        _workflowApplication.InstanceStore = new SqlWorkflowInstanceStore(InstanceStoreConnectionString);

        _workflowApplication.PersistableIdle = (e) =>
            { return PersistableIdleAction.Persist; };
        _workflowApplication.Completed = (e) =>
            {
                _isCompleted = true;
                _instanceUnloaded.Set();
            };
        _workflowApplication.Idle = (e) =>
            { _instanceUnloaded.Set(); };

    } //Rest ommiitted...

リポジトリがデータベースに保存しようとすると、次のエラーが発生します。

'((SharpArch.NHibernate.NHibernateRepositoryWithTypedId<EmployeeRequestSystem.Domain.ErsTrackingRecord,int>)(this._ersTrackingRecordRepository)).Session' threw an exception of type 'System.NullReferenceException'

SharpArch.NHibernate.Contracts.Repositories.INHibernateRepositoryWithTypedId<T,TId>.DbContext = {SharpArch.NHibernate.DbContext}

ワークフロー アクティビティでは、コンテキストを参照し、次のようなサービス ロケーターを使用できます。

    protected override void CacheMetadata(CodeActivityMetadata metadata)
    {
        base.CacheMetadata(metadata);
        metadata.AddDefaultExtensionProvider<INHibernateRepository<AuthorisationRequest>>(
            () => new NHibernateRepository<AuthorisationRequest>());
    }

...

    protected override void Execute(CodeActivityContext context)
    {
        var authorisationRequestRepoistory = context.GetExtension<INHibernateRepository<AuthorisationRequest>>();

ErsTrackingParticipant に正しいコンテキストを取得するにはどうすればよいですか?

4

1 に答える 1

1

あなたの質問から、SynchronizationContextがnull参照と何の関係があるのか​​は私にはわかりません。何がヌルだったかを正確に追跡できれば役に立ちます。

ほとんどの場合、SynchronizationContext.Currentプロパティはnullになります。ホスティング環境で何かによってセットアップされた場合にのみ値があります。彼らがSynchronizationContext.Currentに値を持っていることがわからない限り、WorkflowApplication.Synchronizationコンテキストプロパティを設定しませんでした。

追跡参加者に「コンテキスト」が必要な理由がわかりません。あなたはどのような「文脈」を指しているのですか?同期コンテキスト?CodeActivityContext?

于 2012-08-30T19:25:08.913 に答える