所以基本的想法是:
我们有一些商业模式
public class ViewModel
{
public string Foo { get; set; }
public static explicit operator ViewModel(Model b)
{
// Map instances using AutoMapper or whatever
return new ViewModel { Foo = b.Foo.ToString() };
}
}
它是视图模型表示
explicit operator
我们的基本直觉是将模型映射到视图模型。如您所见,我想使用var model = new Model { Foo = 42 }; // Get model
var viewModel = (ViewModel)model; // Map to view model
执行映射,以便我可以
explicit operator
因此我的控制器代码尽可能干净...... 但是我想让视图模型和映射逻辑保持分离。如何将public static class Extensions
{
public static explicit operator ViewModel(Model b)
{
// Map instances using Automapper or whatever
return new ViewModel { Foo = b.Foo.ToString() };
}
}
实现移动到某个外部类?与扩展方法类似:
$w.bind('resize.example', function () {
var nw = $w.width();
if (nw < 900) {
nw = 900;
}
$c.width(nw * 3);
$c.parent().width(nw);
}).trigger('resize.example');
显然,这个代码没有编译,原因有两个:
- 静态类不能包含用户定义的运算符
- 参数或返回类型必须是扩展名
另外,作为一个选项,我可以使视图模型部分和拆分模型本身和操作符分开 .cs 文件,但它不会成功。从架构上讲,它们仍然是同一名称空间中的同一个类。我希望能够实现映射逻辑,例如,在解决方案中的另一个项目中。
我只想实现类似于扩展方法的效果。我怎么能这样做?
答案 0 :(得分:5)
没有什么比仅仅更好了:
public class ModelToViewModelMapper
{
public ViewModel Map(Model b)
{
return new ViewModel { Foo = b.Foo.ToString() };
}
}
扩展方法可以完成相同的工作,但是如果要更改映射逻辑会怎样。如果使用依赖注入和非静态类
将很容易答案 1 :(得分:2)
为什么不按照 MS 在System.Linq
命名空间中的方式执行此操作;有大量的类型转换是通过扩展方法完成的(你不能用运算符来做,C#不支持扩展运算符)。
定义以下扩展方法:
public static class Extensions
{
public static ViewModel ToViewModel(this Model model) {...}
}
我认为代码仍然足够干净,这似乎是您的主要目标。