[英]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.