我有一个类,它使用一个空接口作为"标记接口",如下所示:
namespace MyNameSpace
{
public interface IMessage
{
//nothing in common here...
}
public class MyMessage : IMessage
{
public void SendMyMessage()
{
//Do something here
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在其他一些帖子中读到了,但在MSDN(http://msdn.microsoft.com/en-us/library/ms182128.aspx)上也应该避免这种情况,你应该使用自定义属性而不是这个空接口.所以,我可以像这样重构我的代码:
namespace MyNameSpace
{
public class MessageAttribute : Attribute
{
//nothing in common here...
}
[MessageAttribute]
public class MyMessage
{
public void SendMyMessage()
{
//Do something here
}
}
}
Run Code Online (Sandbox Code Playgroud)
一切正常,但主要问题是:
当我在程序的其他地方有一个通用方法时,例如:
public IEnumerable<T> GetAll<T>() where T : IMessage
{
//Return all IMessage things here
}
Run Code Online (Sandbox Code Playgroud)
在上面的函数中,我确实需要添加一些泛型类型约束T,因此只 …
我有一个翻译管道,它接受一个字符串作为键,并从字典中返回翻译的字符串.管道看起来像这样:
import {Pipe, PipeTransform} from 'angular2/core';
import {TranslateService} from './translate.service';
@Pipe({
name: 'translate',
pure: false
})
export class TranslatePipe implements PipeTransform {
constructor(private _translateService : TranslateService) {
}
transform(key: string): any {
var translatedText = this._translateService.resources[key];
if (translatedText)
return translatedText;
return key;
}
}
Run Code Online (Sandbox Code Playgroud)
我在我的模板中使用管道,如下所示:
<div>{{'login_EnterNewPassword'|translate}}</div>
Run Code Online (Sandbox Code Playgroud)
哪个将在我的HTML中呈现如下:
<div>Please enter a new password</div>
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好!
TranslatePipe依赖于TranslateService,它包含一个名为resources的字典,其中包含当前语言的翻译.TranslateService的资源加载了对服务器的ajax http调用,如果用户选择其他语言,它可以在后台重新加载.
因为我需要我的UI在发生这种情况时更新所有文本,所以我将管道的pure属性设置为false.
一切都很完美,但事实是,管道经常被执行,因为它是不纯的.如果用户输入10个字符的密码,则每次按键和键入时都会开始更改跟踪,并且对于页面上所有不同的翻译文本,管道将被执行几次.
主要问题是:这是一件坏事吗,它对整体表现有多大的负面影响???
或者是否有另一种强制角度来重新评估所有需求的方法,例如只有当语言改变时?
我非常忙于新MVC应用程序的架构,但我对如何管理不同类型的对象感到非常困惑.混淆是关于实体,业务对象和视图模型之间的关系.我将用一个例子描述我的困惑:
我已经使用不同的项目设置我的Web应用程序:MVC前端,BLL,DAL,常见事物等.
假设我有一个自行车列表的视图.我想显示自行车的细节,如颜色,尺寸,制造商.但在我的数据库中,Bike和Manufacturer是两个不同的表,因此在我的Entity Framework上下文中,这些也是两个不同的类.
所以我有两个实体自行车和制造商.但在我的业务需求中,我认为他们需要成为一个单独的对象,我可以在业务逻辑中操作或使用它.然后有我的观点,需要一个(视图)模型.这也应该是具有来自不同表的属性的组合ViewModel.
我该如何处理?我是否需要从我的DAL获取Bike和Manufacturer对象,并在我的BLL中创建一个业务对象,在做了一些业务逻辑之后,我应该在我的控制器中创建一个ViewModel吗?或者我的DAL是否需要返回合并的业务对象?或者我可以将实体对象用作业务类吗?或者我还可以将我的业务对象用作ViewModel吗?
我希望我的问题很清楚,任何人都可以给我一个很好的建议,告诉我需要哪个对象以及创建不同类型对象的方式,地点和时间,以及这些类应该在哪个层...
在EF6中,我有一个实体Customer,其导航属性为实体地址.地址实体包含属性"City".
我可以急切地加载Address实体,同时让所有客户都这样:
_dbSet.Customers.Include(customer => customer.Address);
Run Code Online (Sandbox Code Playgroud)
这给了我所有的客户,所有的地址属性都加载了.
当然这样可以正常工作,但我在Address表中唯一需要的是"City"字段,在不需要它们的情况下从持久数据存储(SQL Server)获取所有地址属性并不好.
我尝试了以下方法:
_dbSet.Customers.Include(customer => customer.Address.City);
Run Code Online (Sandbox Code Playgroud)
...但这给了我一个运行时异常:
An unhandled exception of type 'System.InvalidOperationException' occurred in mscorlib.dll
Additional information: A specified Include path is not valid. The EntityType 'MyModel.Address'does not declare a navigation property with the name 'City'.
Run Code Online (Sandbox Code Playgroud)
我理解这一点,因为City只是一个字段,而不是与另一个表/实体的关系.
但是有没有另一种方法可以实现我想要的,或者是最佳实践只包括整个地址实体,即使我只需要城市字段???
我想要的是我可以使用myCustomer.Address.City,而不需要对数据库进行额外的查询,但是当我使用myCustomer.Address.Street时,街道属性不是急切加载的,应该另外从中获取数据库...
当我把一个锚元素放在像这样的角度2组件中的某个部分时,
<a [routerLink]="['/LoggedIn/Profile']">Static Link</a>
Run Code Online (Sandbox Code Playgroud)
一切都很好.单击链接时,角度路由器将我路由到目标组件.
现在我想动态添加相同的链接.在我的应用程序的某个地方,我有一个"通知组件",其唯一的责任是显示通知.
通知组件执行如下操作:
<div [innerHTML]="notification.content"></div>
Run Code Online (Sandbox Code Playgroud)
其中notification.content是NotificationComponent类中的字符串变量,包含要显示的HTML.
notification.content变量可以包含类似的内容
<div>Click on this <a [routerLink]="['/LoggedIn/Profile']">Dynamic Link</a> please</div>
Run Code Online (Sandbox Code Playgroud)
一切正常,并显示在我的屏幕上,但当我点击动态链接时没有任何反应?!
有没有办法让角度路由器使用这个动态添加的链接???
PS.我知道DynamicComponentLoader,但我真的需要一个更无限制的解决方案,我可以将各种HTML发送到我的通知组件,具有各种不同的链接....
假设我的服务器应用程序中有两个或更多集线器。我的 javascipt 客户端(Angular SPA)最初需要连接到第一个集线器,并且需要订阅这样的方法:
connection = $.hubConnection(appSettings.serverPath);
firstHubProxy = connection.createHubProxy('firstHub');
firstHubProxy('eventFromFirstHub', function () {
console.log('Method invokation from FirstHub');
});
connection.start().done(function (data) {
console.log("hub started");
});
Run Code Online (Sandbox Code Playgroud)
一切正常。现在,我的 Angular SPA 用户可能决定在他的页面上放置一个小部件,该小部件需要订阅来自第二个集线器的方法:
secondHubProxy = connection.createHubProxy('firstHub');
secondHubProxy('eventFromSecondHub', function () {
console.log('Method invokation from SecondHub');
});
Run Code Online (Sandbox Code Playgroud)
第二个集线器的方法不起作用。我猜是因为它是在connection.start().
我的示例是简化的,在我的实际应用程序中,将有 20 多个中心,用户可能会或可能不会通过向其页面添加或删除小部件来订阅这些中心。
据我所知,我有两个选择:
有没有人知道我可以用来完成这个的模式?还是我在这里遗漏了一些非常简单的东西?
我在我的应用程序中使用 SignalR 以允许我的 ASP.NET 服务器应用程序将数据推送到我的 Angular SPA Web 客户端。在 Web 应用程序中,我包含了 jquery.signalR-2.2.0.js 文件。我不在 http(s)://serverurl/signalr/hubs 上使用自动生成的代理。
Web 应用程序有多个可重用的小部件(指令),每个小部件都有自己独立的作用域。同一小部件/指令的多个实例需要注册一个可由服务器的 SignalR 集线器执行的回调,因此我有一个这样的功能:
var on = function (eventName, callback) {
proxy.on(eventName, callback);
};
Run Code Online (Sandbox Code Playgroud)
这个函数在一个单独的服务中,它也有连接和代理对象,直到现在一切正常......
从一个负责小部件实例的角度控制器,上面的函数被调用如下:
var callback = function (){
console.log('Callback fired on controller with Id' + $scope.id)
}
proxyHub.on('myEvent',callback);
Run Code Online (Sandbox Code Playgroud)
控制器处于隔离范围内,因此 var 回调是每个控制器的不同对象。
我能够为来自不同控制器的同一事件注册多个回调,并且一切仍然按预期工作。
现在我需要从控制器实例取消注册回调,所以我在我的单独服务中有以下方法:
var off = function(eventName,callback) {
proxy.off(eventName,callback);
};
Run Code Online (Sandbox Code Playgroud)
这是从特定的控制器实例调用的,如下所示:
//callback is exactly the same variable as used in the .on function for this controller
hubProxy.off('myevent',callback);
Run Code Online (Sandbox Code Playgroud)
麻烦来了:只有最后注册的回调会从事件中删除。所有其他注册的回调仍然被调用。如果我再次尝试调用 .off 函数,则什么也不会发生,并且我无法取消注册其他回调。
主要问题是:如何从事件中取消注册特定回调???
c# ×3
javascript ×3
angular ×2
asp.net ×2
signalr ×2
typescript ×2
angularjs ×1
architecture ×1
asp.net-mvc ×1
generics ×1
interface ×1
oop ×1
signalr-hub ×1