小编Eri*_*tas的帖子

有没有理由在界面中隐藏继承的成员?

我知道从另一个类继承的类可能会使用new关键字隐藏属性.但是,这隐藏了属性的特定实现,因此我可以看到它是如何使用的.

是否有任何实际的理由在实现其他接口的接口中隐藏成员?例如,考虑以下示例.IChildInterface 实施IParentInterface和隐藏PropertyA.

interface IParentInterface
{
    string Name { get; set; }
    int PropertyA { get; set; }
    int PropertyB { get; set; }
}

interface IChildInterface : IParentInterface
{
    int PropertyA { get; set; }
    int PropertyC { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

.net c# polymorphism interface

13
推荐指数
2
解决办法
2686
查看次数

是什么原因导致BindingList <T>中的ListChangedType.ItemMoved ListChange事件?

我有一个BindingList(T),我在DataGrid中显示.我正在观察ListChanged事件并在引发ListChanged事件时执行不同的操作.

我正在检查事件的ListChangeType参数以检查列表的更改方式,然后相应地进行响应.但是,我注意到有一个ListChanged事件类型为ItemMoved.

我有"上移"和"下移"按钮,可以在列表中上下移动项目.但这些实际上是删除所选项目,然后将其重新插入更高或更低的位置.

但是,我没有看到BindingList(T)的任何方法,它看起来会移动列表中的项目.所以我错过了一些东西,或者只是没有办法在BindingList中移动一个也会引起ItemMoved类型ListChanged事件的项目?

void FloorCollection_ListChanged(object sender, ListChangedEventArgs e)
{
    if (e.ListChangedType == ListChangedType.ItemAdded)
    {    
        //DO STUFF
    }
    else if (e.ListChangedType == ListChangedType.ItemDeleted)
    {
        //DO STUFF
    }
    else if (e.ListChangedType == ListChangedType.ItemMoved)
    {
        //HOW DO I GET THIS CODE TO RUN?
    }
    else if (e.ListChangedType == ListChangedType.ItemChanged)
    {
        //DO STUFF
    }
}
Run Code Online (Sandbox Code Playgroud)

c# events list bindinglist

12
推荐指数
1
解决办法
3766
查看次数

如何处理与存储库模式的表关系?

我正在将存储库模式实现为ASP.NET MVC站点的一部分.我见过的大多数关于存储库的例子都相当简单.例如,这是一个典型的抽象存储库接口.

public interface IRepository<TEntity>
{
    IQueryable<TEntity> All();
    TEntity FindBy(int id);
    TEntity FindBy(Expression<Func<TEntity, bool>> expression);
    IQueryable<TEntity> FilterBy(Expression<Func<TEntity, bool>> expression);
    bool Add(TEntity entity);
    bool Update(TEntity entity);
    bool Delete(TEntity entity):
}
Run Code Online (Sandbox Code Playgroud)

我很清楚如何使用这样的存储库来添加,更新,删除或获取单一类型的实体.但是,您如何处理创建和操纵不同类型之间的一对多或多对多关系?

假设您有一个Item类型,其中每个项目都分配给a Category.您将如何通过存储库进行此分配?这应该取决于Update(Category c)和/或Update(Item i)方法来确定需要与正在更新的元素建立什么关系?或者应该有一个明确的AssignCategoryToItem(Item i, Category c)方法?

如果它有任何区别我正在使用Fluent NHibernate来实现我的具体存储库.

asp.net-mvc many-to-many one-to-many fluent-nhibernate repository-pattern

12
推荐指数
1
解决办法
4216
查看次数

使用Entity Framework将项添加到集合中

我正在尝试使用Entity Framework 4遵循DDD存储库模式.但是我在保存对我的聚合根的集合属性的更改时遇到了问题.考虑下面的课程.Item是我的聚合根,其中包含SubItem实体的集合.

public class Item
{
    public int ItemId { get; set; }
    public string Name { get; set; }
    public ICollection<SubItem> SubItems { get; private set; }

    public Item()
    {
        this.SubItems = new HashSet<SubItem>();
    }
}

public class SubItem
{
    public int ItemId { get; set; }
    public int SubItemId { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

接下来,我为我的聚合根类定义了一个存储库接口

public interface IItemRespository
{
    Item Get(int id);
    void Add(Item i);
    void Save(Item i);
}
Run Code Online (Sandbox Code Playgroud)

现在这是我的DbContext类,它设置了EF映射. …

.net c# domain-driven-design ddd-repositories entity-framework-4

12
推荐指数
1
解决办法
2万
查看次数

PropertyGrid控件的默认内置编辑器

我似乎无法在任何地方找到答案.默认编辑器/转换器构建到3.5 Framework PropertyGrid控件中.否则我可以抛出哪些对象类型,它能够可靠地显示和编辑?我发现了很多关于使用自定义编辑器的教程(我可能会在某些时候做).但是现在我的程序中我允许用户创建自己的自定义属性,我想知道我应该允许哪些对象类型,假设他们将在PropertyGrid中编辑它们.

c# propertygrid editor

11
推荐指数
2
解决办法
7150
查看次数

我可以在DLL中嵌入其他文件吗?

我正在通过API为另一个应用程序编写插件.插件分发了一个DLL.是否可以在DLL文件中嵌入其他文件,如pdf,图像,chm帮助文件等...我希望能够提供插件的文档,但我仍然希望保留分发插件的能力-in作为单个文件,用户只需拖放到要安装的应用程序上即可.

.net c# dll embedding winforms

11
推荐指数
3
解决办法
2万
查看次数

如何在多个线程之间进行通信?

我正在为另一个程序编写一个插件,该程序使用本机程序打开一系列文件以从中提取一些数据.我遇到的一个问题是该过程需要很长时间,我想保持用户界面不挂.另外,我还想让用户在完成之前取消该过程.在过去,我使用后台工作者来处理这类事情,但在这种情况下,我认为BackgroundWorker不会起作用.

要通过API创建插件,我使用的可以通过继承IAPICommand接口来创建自定义命令.该接口包括Execute(应用程序app)方法.然后实例化该类,当用户在程序中唤起自定义命令时,程序将调用Execute()方法.

Execute()方法在调用时传递对当前Application对象的引用,并且该应用程序对象用于打开文件以从中提取数据.但是,应用程序实例无法在原始Execute()线程之外的线程请求时打开文档.

因此,通常UI将存在于主线程上,并且将在辅助线程上执行耗时的数据提取.但是,在这种情况下,必须在主线程上执行数据提取,并且我需要为UI创建辅助线程.

这是代码的精简版本.

class MyCommand:IAPICommand
{
    public void Execute(Application app) // method from IAPICommand
    {
        Thread threadTwo= new Thread(ShowFormMethod);
        threadTwo.Start();
    }

    public void ProcessWidget(Widget w, Application app)
    { 
        //uses an App to work some magic on C
        //app must be called from the original thread that called ExecuteCommand()
    }

    //method to open custom form on a seperatethread
    public void ShowFormMethod()
    {
      MyForm form = new MyForm();
      form.ShowDialog();  
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个流程图,显示了我认为这应该最终起作用的方式.

alt text http://dl.dropbox.com/u/113068/SOMLibThreadingDiagram.jpg

  1. 这个图表是否有意义,如果是这样,我甚至采取正确的方法来解决这个问题?
  2. 一旦主线程启动UI线程,我希望它等待用户选择要处理的小部件,或者通过关闭表单结束命令(图中的红色数字).如何使主线程等待,以及如何触发它继续处理或在UI线程结束时继续结束?我以为我可以让主线程在Monitor锁上等待.然后,UI线程将填充要处理的静态Widgets列表,然后脉冲主​​线程以触发处理.当窗体关闭时,UI线程也会激活主线程,如果要处理的窗口小部件列表为空,主线程将知道继续到命令的结尾.
  3. 如何允许主线程将窗口小部件处理的进度或完成传回UI线程(图中的黄色箭头)?我只是使用Form的BeginInvoke()方法来执行此操作吗? …

c# multithreading thread-safety winforms

11
推荐指数
2
解决办法
3036
查看次数

如何创建不需要管理员访问权限的Windows安装程序MSI

我已经创建了一个MSI Windows安装程序,它安装了一个插件,我为我办公室使用的一个软件编写了这个插件.但是,这里的许多用户对他们的计算机没有管理员权限,并且IT部门因为必须为他们安装插件而感到沮丧.

我的安装程序除了将几个文件复制到用户可以访问复制文件的位置之外什么都不做.有没有办法修改我的安装项目,以便生成的MSI不需要管理员权限?

c# windows-installer setup-project visual-studio-2010

11
推荐指数
2
解决办法
5983
查看次数

我应该如何在聚合根之间强制执行关系和约束?

关于DDD模型中两个聚合根之间的引用之间的关系,我有几个问题.请参阅下面的典型客户/订单模型.

在此输入图像描述

首先,聚合的实际对象实现之间的引用是否总是通过ID值而不是对象引用来完成?例如,如果我想要订单客户的详细信息,我需要获取CustomerId并将其传递给ICustomerRepository以获取客户,而不是设置Order对象以直接返回客户正确的客户?我很困惑,因为直接返回客户似乎会使编写代码对模型更容易,并且如果我使用像NHibernate这样的ORM,则设置起来并不困难.但我相当肯定这会违反聚合根/存储库之间的界限.

其次,对于两个聚合根,应该在何处以及如何对删除关系实施级联?例如,假设我希望在删除客户时删除所有关联的订单.ICustomerRepository.DeleteCustomer()方法应该不应该引用IOrderRepostiory吗?这似乎会破坏聚合/存储库之间的界限?我是否应该使用CustomerManagment服务来处理删除客户及其相关订单,这些订单将引用IOrderRepository和ICustomerRepository?在这种情况下,我如何确保人们知道使用服务而不是存储库来删除客户.这仅仅是为了教育他们如何正确使用模型?

domain-driven-design aggregate aggregateroot

11
推荐指数
1
解决办法
4484
查看次数

是否存在用于命名/组织存储日志数据的Elasticsearch索引的约定?

我正在将Elasticsearch和Kibana设置为我们办公室的集中式日志记录平台.

我们有许多自定义实用程序和插件,我想跟踪用户的使用情况以及用户是否遇到任何错误.更不用说还有我想跟踪的服务器和预定工作.

因此,如果我有许多不同的日志数据源,所有这些源都会转到同一个弹性搜索集群,那么它们如何组织成索引和文档类型的约定或最佳实践呢?

Logstash使用的默认索引值是"logstash-%{+YYYY.MM.dd}".所以看起来最好用当前日期后缀任何索引名称,因为这样可以很容易地清除旧数据.

但是,Kibana允许添加可以在UI中选择的多个"索引模式".然而,我读过的所有教程都只提到创建一个单一的模式logstash-*.

如何在实践中使用多种索引模式?我是否只为我的数据的所有来源命名?如:

BackupUtility-%{+YYYY.MM.dd}
UserTracker-%{+YYYY.MM.dd}
ApacheServer-%{+YYYY.MM.dd}
Run Code Online (Sandbox Code Playgroud)

我在一些具有弹性搜索目标的工具中使用nLog.nLog和其他类似日志框架的约定是为源代码中的每个类都有一个"记录器".这些记录器是否应该转换为弹性搜索中的索引?

MyCompany.CustomTool.FooClass-%{+YYYY.MM.dd}
MyCompany.CustomTool.BarClass-%{+YYYY.MM.dd}
MyCompany.OtherTool.BazClass-%{+YYYY.MM.dd}
Run Code Online (Sandbox Code Playgroud)

或者这对于弹性搜索索引名称来说太过细化了,最好只坚持应用程序的单个日期索引?

CustomTool-%{+YYYY.MM.dd}
Run Code Online (Sandbox Code Playgroud)

elasticsearch kibana kibana-4 elastic-stack

11
推荐指数
2
解决办法
4980
查看次数