c# - 从 viewmodel 调用泛型方法
问题描述
我对泛型和 MVVM 还是很陌生。在学校为一个项目做这个,我的问题可能是我试图给人留下深刻的印象。我想我可能已经把自己编码进了一个洞,但我希望你们都可以帮助我摆脱它。
我已经创建了一个 dbcontext、一个数据服务,现在我正试图让它们在我的视图模型中很好地发挥作用——我无处可去。
数据库上下文工厂:
public class TimeKeeprDbContextFactory : IDesignTimeDbContextFactory<TimeKeeprDbContext>
{
public TimeKeeprDbContext CreateDbContext(string[] args = null)
{
var options = new DbContextOptionsBuilder<TimeKeeprDbContext>();
options.UseSqlServer("Server=(localdb)\\MSSQLLocalDB;Database=TimeKeeprDB;Trusted_Connection=True;");
return new TimeKeeprDbContext(options.Options);
}
}
数据库上下文:
public class TimeKeeprDbContext : DbContext
{
public TimeKeeprDbContext(DbContextOptions options) : base(options) { }
public DbSet<User> Users { get; set; }
public DbSet<Event> Events { get; set; }
}
数据服务:
public class DataService<T> : IDataService<T> where T: DomainObject
{
private readonly TimeKeeprDbContextFactory _contextFactory;
public DataService(TimeKeeprDbContextFactory contextFactory)
{
_contextFactory = contextFactory;
}
public async Task<T> Create(T entity)
{
using TimeKeeprDbContext context = _contextFactory.CreateDbContext();
EntityEntry<T> createdResult = await context.Set<T>().AddAsync(entity);
await context.SaveChangesAsync();
return createdResult.Entity;
} [...]
基础视图模型:
public class BaseViewModel : INotifyPropertyChanged
{
#region WindowProperties
[.....]
#endregion
#region PropertyChanged
protected void OnPropertyChanged<T>(Expression<Func<T>> action)
{
var propertyName = GetPropertyName(action);
OnPropertyChanged(propertyName);
}
private static string GetPropertyName<T>(Expression<Func<T>> action)
{
var expression = (MemberExpression)action.Body;
var propertyName = expression.Member.Name;
return propertyName;
}
private void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs(propertyName);
handler(this, e);
}
}
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
视图模型:
public class MainViewModel : BaseViewModel
{
private string _firstname;
private string _lastname;
public string FirstName
{
get => _firstname;
set
{
_firstname = value;
OnPropertyChanged(() => FirstName);
}
}
public string LastName
{
get => _lastname;
set
{
_lastname = value;
OnPropertyChanged(() => LastName);
}
}
public ICommand CreateCommand { get { return new BaseCommand(Click); } }
private void Click()
{
User user = new User()
{
FirstName = _firstname,
LastName = _lastname
};
//call Create<T> from DataService
ShowMessageBox($"{user.FirstName} {user.LastName}"); //just to make sure the object is ok
}
}
我已经尝试了大约一百万件事,但我似乎无法理解我需要做什么才能从视图模型中的 DataService 调用“Create(user)”。有人可以指出我正确的方向吗?
PS我已经用谷歌搜索直到我的手指流血,但不幸的是,它并没有太大帮助。
解决方案
很难说,因为我不知道您正在使用的所有框架或 nuget 包。但据我所知,您只需要在 MainViewModel 中的某处实例化您的 DataService,然后Create
在您放置评论的地方调用它的方法//call Create<T> from DataService
。
//Instantiate your DataService somewhere
var service = new DataService<User>(new TimeKeeprDbContextFactory());
//call Create<T> from DataService
service.Create(user);
如果您在下面看到一条波浪线,service.Create(user)
表明此调用未被等待,您可以通过像这样使您的函数 async/await 来解决这个问题。
private async void Click()
{
User user = new User()
{
FirstName = _firstname,
LastName = _lastname
};
//Instantiate your DataService somewhere
var service = new DataService<User>(new TimeKeeprDbContextFactory());
//call Create<T> from DataService
await service.Create(user);
ShowMessageBox($"{user.FirstName} {user.LastName}"); //just to make sure the object is ok}```
}
推荐阅读
- android - 使用改造对 mvvm 中的 Rxjava 进行错误处理
- java - 如何将我的枚举类返回设置为 ArrayList Java
- c# - System.IO.TextWriter.WriteLine(字符串值)引发 OutOfMemory 异常
- wso2 - wso2is 5.9 CustomUserStoremanager 的配置问题
- python - Robotframework:AttributeError:'dict'对象没有属性'has_key'
- mongodb - 在 mongodb 缝合应用程序中创建一个集合
- python - readthedocs构建时如何删除doctest标志?
- c# - 通过 XPath 查找带有方括号内的属性名称的元素
- azure-active-directory - 通过 API 访问个人帐户的 OneDrive 文档或企业帐户中的一个用户
- r - 成对序列分析 - 寻找独特组合的索引