我有一个类作为数据库层之上的一层,以便于数据库访问,它工作得非常好。 但是现在我希望所有从数据库中读取的方法能够异步访问,而不会冒任何危险的风险。所以我认为如果我实现一个只有“读”方法的接口,我可以在使用异步线程时引用该接口而不是普通类。
有没有更好的(但希望类似的)方法来实现这一目标?
这是我尝试了多远的一个例子,但没有成功:
// 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");
}
通过这种方式,我有了实际相同的对象,但是根据我给它的方法以及我如何投射它们,他们可以被强制使用它们的线程安全与否。
答案 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();
}
}