繁体   English   中英

异步方法的继承接口,最佳实践

[英]Inherit Interface for async methods, best practice

我有一个类可以用作数据库层之上的一个层,以方便数据库访问,并且它工作得很好。 但是现在,我希望能够异步访问从数据库读取的所有方法,而不会做任何危险的事情。 因此,我认为,如果我仅使用“读取”方法实现接口,那么在异步线程上工作时,可以引用该接口,而不是普通类。

有没有更好(但希望类似)的方法来实现这一目标?

这是我尝试过但没有成功的示例:

// My two interfaces.
// The UserCoreManager class is the layer that works with the database
// layer for the users table.
// but the IUserCoreManagerAsync only reference the async friendly methods.

public interface IUserCoreManagerAsync
{
    User GetData();
}

public interface ICoreAsync
{
    IUserCoreManagerAsync User { get; }
}

到现在为止还挺好。 通过在ICoreAsync接口中引用用户,理论上我将只能获取数据而不能保存任何内容?

这是我实现接口的实际类如下所示:

public class UserCoreManager : IUserCoreManagerAsync
{
    public User GetData()
    {
        ...
    }

    public User SetData()
    {
        ...
    }
}

public partial class Core : ICoreAsync
{
    private UserCoreManager user;
    public UserCoreManager User // <- This is the tricky part
    {
        get
        {
            return user;
        }
        protected set
        {
            user = (UserCoreManager)value;
        }
    }
}

如您所见,UserCoreManager有一个SetData()方法,因此在使用该方法时,如果也未引用该接口,则对我来说不是线程安全的。 但是,正如您还可以看到的那样,我没有实现返回IUserCoreManagerAsync的interface属性,但是我有点希望UserCoreManager属性能够解决问题。

你会怎么做? 我的目标是在使用这些类时实现以下目标:

public void DoSomeAsyncWork(ICoreAsync core)
{
    var myData = core.User.GetData();
}

public void DoSomeWork(Core core)
{
    core.User.SetData("some data");
}

这样,我有一个实际的对象,但是根据我使用的方法以及强制转换的方式,可以强制它们使用线程安全与否。

看一下这个

public interface IUserCoreMagagerWrite
{ 
    public void SetData(User user);
}

public interface IUserCoreManagerRead
{
    public User GetData();
}

public interface IUserCoreManagerReadWrite : IUserCoreManagerRead, IUserCoreMagagerWrite
{ 

}

public class UserCoreManager : IUserCoreManagerReadWrite
{
    public User GetData()
    {
        return new User("abbo");
    }

    public void SetData(User user)
    {
        //...
    }
}


public class Core
{
    public IUserCoreManagerReadWrite UserCoreManager { get; set; }
}

public class AsyncCore
{
    public IUserCoreManagerRead UserCoreManager { get; set; }
}

public class TheProgram
{
    public void SynchronousWork()
    {
        Core core = new Core();
        User user = core.UserCoreManager.GetData();
        core.UserCoreManager.SetData(user);
    }

    public void AsyncWork()
    {
        AsyncCore core = new AsyncCore();
        User user = core.UserCoreManager.GetData();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM