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

时间:2014-09-04 21:13:53

标签: c# asynchronous interface

我有一个类作为数据库层之上的一层,以便于数据库访问,它工作得非常好。 但是现在我希望所有从数据库中读取的方法能够异步访问,而不会冒任何危险的风险。所以我认为如果我实现一个只有“读”方法的接口,我可以在使用异步线程时引用该接口而不是普通类。

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

这是我尝试了多远的一个例子,但没有成功:

// 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接口中引用User,我会 从理论上讲,只能获取数据而不能保存任何数据?

以下是我实现接口的实际类:

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的接口属性,但我有点希望UserCoreManager属性可以解决问题。

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

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

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

通过这种方式,我有了实际相同的对象,但是根据我给它的方法以及我如何投射它们,他们可以被强制使用它们的线程安全与否。

1 个答案:

答案 0 :(得分:0)

检查出来

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();
    }
}