我正在使用一些遗留代码并拥有此现有界面:
public interface IProcess
{
IDTO Process(IDTO request);
}
Run Code Online (Sandbox Code Playgroud)
然后有一个工厂有一个巨大的switch语句返回实现接口的对象(其中17个).创建的对象然后调用进程,如:
return xProcess.Process(requestDTO);
Run Code Online (Sandbox Code Playgroud)
我的问题是我现在需要更改其中的一些以传递第二个参数,如:
xProcess.Process(requestDTO, Id);
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种优雅的方式来实现这一目标.
我试过让接口成为一个抽象类,如:
public abstract class IProcess
{
public virtual IDTO Process(IDTO request)
{
return null;
}
public virtual IDTO Process(IDTO request, int Id)
{
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
这允许我在创建的类中重写Process方法,但是我有一个问题,即IProcess由另一个接口继承,现在显然已经破坏了.
传统平台非常庞大,测试覆盖率也不高,所以我正在寻找一个优秀的解决方案,对代码库的其余部分影响最小.也许,有一种我忽略的模式?
有人可以帮忙吗?(例子很棒)
谢谢
大卫
我正在以异步方式使用JavaScript $ ajax加载一些脚本.我需要它们以某种顺序加载,但此刻它是随机的.
我的代码是:
loadScripts();
function loadScripts() {
getBootStrapperScript(function (callback) {
alert('bootStrapper loaded');
})
getXMLScript(function (callback) {
alert('xml script loaded');
});
getFormScript(function (callback) {
alert('form script loaded');
});
}
function getBootStrapperScript(callback) {
$.ajax({
url: "http://localhost/eSales/scripts/bootStrapper.js",
dataType: "script"
}).done(callback);
}
function getXMLScript(callback) {
$.ajax({
url: "http://localhost/eSales/scripts/LoadXML.js",
dataType: "script"
}).done(callback);
}
function getFormScript(callback) {
$.ajax({
url: "http://localhost/eSales/scripts/LoadForm.js",
dataType: "script"
}).done(callback);
}
Run Code Online (Sandbox Code Playgroud)
你可以看到它在这个jsFIddle中运行
有没有一种优雅的方法可以确保脚本按照定义的顺序加载?
对不起这里的代码量,但这是解释发生的事情的最佳方式.
我在MVC 4局部视图中给出了这段代码:
<script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
@using (Ajax.BeginForm("TestPost", new AjaxOptions { HttpMethod = "Post" }))
{
foreach (var d in Model.DataItemsWithLabels)
{
@Html.LabelFor(m => d.DataName)
@Html.TextBoxFor(m => d.DataValue);
}
<input type="submit" value="Save" />
}
Run Code Online (Sandbox Code Playgroud)
我的控制器动作如下:
public ActionResult TestPost(CmaPartialModel model)
{
return PartialView("Transaction", model);
}
Run Code Online (Sandbox Code Playgroud)
在我的模型中,我有一些代码填充了一个对象列表(只有它们是空的),定义为:
public List<DataItemWithLabel> DataItemsWithLabels { get; set; }
public class DataItemWithLabel
{
public string DisplayName { get; set; }
public string DataName { get; set; }
[Required]
public string DataValue { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我还有什么认为正确的web.config条目:
我在这里和其他地方阅读过大量帖子但没有成功. …
我需要创建一个可以保存以下类型值的类: int?, decimal?, date, bool? string.
我希望能够这样做:
var x = new MyClass<int?>()
x.Value = null;
x.value = 99;
// or
var y = new MyClass<bool?>();
y.Value = null;
y.Value = true
// and so on
Run Code Online (Sandbox Code Playgroud)
我一直试图创建一个类型为T的类:
public class TestClass<T>
{
public T? Value{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想使用Value来获取任何允许的类型,但我不能使T为空.错误是:
只有非可空值类型才能成为Sysytem.Nullable的基础
无论如何都在做我想要实现的目标?
是否可以T根据运行时变量的类型创建类的实例?
例如:
var myType = myVariable.GetType();
var myTestClass = new TestClass<myType>();
Run Code Online (Sandbox Code Playgroud)
这不会编译,但希望显示我想要实现的目标.
有办法吗?
编辑
说这个类是这样的:
public class TestClass<T>
{
public string StringValue
{
get
{
return this.TypeValue == null ? string.Empty : this.TypeValue.ToString();
}
}
public T TypeValue { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如果我做了类似的事情:
var test1 = TestClass((dynamic)x); // x is an int
我可以设置像 test1.TypedValue = 10
如果我做了类似的事情:
var test2 = TestClass((dynamic)y); // y is a bool
我可以设置像 test2.TypedValue = true
目前我收到错误说明
不能隐式地将类型int转换为TestClass(或bool转换为TesClass)
我有一个淘汰模板:
<script type="text/javascript" id="myList">
// template stuff here
</script>
Run Code Online (Sandbox Code Playgroud)
我用foreach选项调用它:
<div data-bind="template: { name:'myList', foreach: ItemList }"></div>
Run Code Online (Sandbox Code Playgroud)
我从我的控制器获取视图模型并使用以下Javascript来绑定它:
var viewModel = ko.mapping.fromJS(@Html.Raw(JsonConvert.SerializeObject(Model));
ko.applyBindings(viewModel, document.getElementById("contentsDetails"));
Run Code Online (Sandbox Code Playgroud)
我从我的控制器返回一些项目,一切都很好.
我的问题是,如果我添加到我的可观察数组
var itemToAdd = {
Name: ko.observable("name a"),
Desc: ko.observable("desc a")
}
viewModel.MyObservableArray().push(itemToAdd);
Run Code Online (Sandbox Code Playgroud)
我已经使用以下方法检查了数组是否可观察:
console.log(ko.isObservable(viewModel.MyObservableArray));
Run Code Online (Sandbox Code Playgroud)
它不会通过将新项添加到列表来更新UI模板.
我在这做错了什么?
我正在尝试使用ajax访问跨域.js文件:
$.ajax({
type:'get',
crossDomain:true,
url: "http://localhost/62588/scripts/bootStrapper.js",
contentType: "application/json",
dataType: 'jsonp'
}).done(callback);
Run Code Online (Sandbox Code Playgroud)
我现在有一个回调:
getBootStrapperScript(function (callback) {
//do somethibg
})
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
XMLHttpRequest cannot load http://localhost/62588/scripts/bootStrapper.js. Origin http://localhost:62607 is not allowed by Access-Control-Allow-Origin.
Run Code Online (Sandbox Code Playgroud)
我一直在阅读有关JSONP但我不确定如何使用它从anoather域加载.js文件.
如果我更改上面的代码使用'jsonp'作为数据类型,但我得到这个错误:
GET http://localhost/62588/scripts/bootStrapper.js?callback=jQuery18206067646441515535_1354459693160&_=1354459696966 404 (Not Found)
Run Code Online (Sandbox Code Playgroud)
如何加载跨域js文件?
我有以下代码和一个模块
var def = $.Deferred();
$.getJSON("http://localhost:62588/api/Values/getXMLData")
.done(function(json){
def.resolve($.parseJSON(json));
});
return def;
Run Code Online (Sandbox Code Playgroud)
然后,我必须从另一个模块调用它,以便在调用处理返回的数据之前完成.
repository.getUserPolicies().done(function (userPolicies) {
process(userPolicies);
});
Run Code Online (Sandbox Code Playgroud)
这很好用但我还不太明白延迟对象是如何工作的.
我已经读过你可以使用getJSON的延迟对象,但不确定这是否正是我在这里做的?
我想知道这种方法有什么缺点吗?
可以更优雅地完成吗?
谢谢
javascript ×4
c# ×3
jquery ×3
ajax ×2
asp.net-mvc ×2
generics ×2
asp.net-ajax ×1
interface ×1
knockout.js ×1
nullable ×1
oop ×1