小编Gor*_*ran的帖子

SimpleIoc - 它是否可以在每次需要时提供新实例?

据我所知,SimpleIoc使用GetInstance方法来检索已注册的类的实例.如果实例不存在,它将创建它.但是,此实例被缓存并始终检索,这模仿单例模式.

我的想法是,如果这个ViewModel需要两次的可能性很小,就没有必要在内存中保留ViewModel的实例,所以我想在每次需要时创建它的新实例.如果我们有一个ViewModel工厂,我们将拥有这样的属性:

public MyViewMOdel MyViewModel
{
    get { return SimpleIoc.Default.GetInstance<MyViewModel>(); }
}
Run Code Online (Sandbox Code Playgroud)

这个使用单例模式,我认为在所有情况下都不是最佳实践.为了避免这个问题,我这样做:

public MyViewModel MyViewModel
{
    get { return new MyViewModel(SimpleIoc.Default.GetInstance<ISomeInterface>()); }
}
Run Code Online (Sandbox Code Playgroud)

这个有一个缺点,如果我更改了MyViewModel的构造函数,我还需要更新此属性.没什么大不了的,但仍有某种依赖性.

你如何处理这种情况,我有什么遗漏?以及为什么决定不返回非共享实例.

另一个问题是,在MVVM Deep dive会话中,Laurent在注册特定的ViewModel之后立即使用GetInstance方法,正如他所说的那样,确保容器中已存在此ViewModel的实例.为什么这有必要?如果您通过ViewModelLocator获取ViewModel,那么您将在需要时创建它.那么我为什么要提前创建它们呢?

mvvm mvvm-light silverlight-5.0 c#-4.0

19
推荐指数
1
解决办法
9080
查看次数

验证错误模板 - 绑定异常

我使用以下模板进行验证错误:

<ControlTemplate>
    <Border BorderBrush="Red" BorderThickness="1">
        <Grid>
            <Polygon Points="8,8 8,0 0,0"
                     Stroke="Black"
                     StrokeThickness="1"
                     Fill="Red"
                     HorizontalAlignment="Right"
                     VerticalAlignment="Top"
                     ToolTip="{Binding ElementName=adorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" />
            <AdornedElementPlaceholder x:Name="adorner"/>
        </Grid>
    </Border>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)

ToolTip工作正常,但在离开当前记录后会抛出以下异常:

System.Windows.Data错误:17:无法从'(Validation.Errors)'获取'Item []'值(类型'ValidationError')(类型'ReadOnlyObservableCollection`1').BindingExpression:路径= AdornedElement(0)[0] .ErrorContent; DataItem ='AdornedElementPlaceholder'(Name ='adorner'); target元素是'Polygon'(Name =''); target属性是'ToolTip'(类型'Object')ArgumentOutOfRangeException:'System.ArgumentOutOfRangeException:指定的参数超出了有效值的范围.

我尝试了HasError财产,但失败了.任何人有任何想法?

.net wpf xaml exception

16
推荐指数
1
解决办法
4423
查看次数

VS 2012/2013 AccessViolationException

当我运行项目(F5)时,我在IDE中收到以下异常:

An unhandled exception of type 'System.AccessViolationException' occurred in System.Windows.Forms.dll
Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪报告

at System.Windows.Forms.UnsafeNativeMethods.SendMessage(HandleRef hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.Control.SendMessage(Int32 msg, Int32 wparam, IntPtr lparam)
at System.Windows.Forms.Form.UpdateWindowIcon(Boolean redrawFrame)
at System.Windows.Forms.Form.CreateHandle()
at System.Windows.Forms.Control.get_Handle()
at Microsoft.VisualStudio.HostingProcess.HostProc.RunParkingWindowThread()
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) …
Run Code Online (Sandbox Code Playgroud)

visual-studio visual-studio-2012 visual-studio-2013

15
推荐指数
1
解决办法
9660
查看次数

将任务作为参数传递

我不确定这是否可行,所以我在这里:

我有一系列动作来执行多个

async Task MethodA(...)
{
    // some code
    // a call to specific Async IO bound method
    // some code
}
Run Code Online (Sandbox Code Playgroud)

还有MethodB(),MethodC()等,以及所有的具有完全相同的代码,除了呼叫到特定的异步IO绑定的方法.我试图找到一种方法将任务指针传递给方法,以便我们稍后可以在Method()中执行它.

我目前正在做的是:

private async Task Method(Func<Task<Entity>> func)
{
    // some code
    var a = await task.Run(func);
    // some code
}

var task = async () => await CallToIOBoundTask(params);
Method(task);
Run Code Online (Sandbox Code Playgroud)

但是,此代码每次都会提取一个新线程,这对于IO绑定任务不是必需的,应该避免使用.

那么,有没有办法重构代码,以便不使用ThreadPool线程?目标是拥有这样的代码:

private async Task Method(Task<Entity> task)
{
    // some code
    var a = await task;
    // some code
}
Run Code Online (Sandbox Code Playgroud)

同样重要的是要提到不同的IO调用具有不同的方法签名.此外,任务可以开始仅在Method()正文中执行,而不是之前执行.

.net c# task-parallel-library async-await .net-4.5

14
推荐指数
1
解决办法
9242
查看次数

DbContext和RejectChanges

我正在使用RIA服务,其中ObjectContext有RejectChanges()方法.但是,我现在正在桌面应用程序中使用EF 4.4,我找不到该方法.所以,我的问题是:在我允许用户对收集进行批量CrUD操作的场景中,我将如何恢复所有更改?我可以继续重新创建Context并再次获取数据,但如果我需要将更改恢复为1-2个实体,那么这听起来非常不必要.

那么,拒绝变更的最佳方法是什么?而且,我们如何知道上下文是否正在做某事(IsBusy)?

entity-framework

9
推荐指数
2
解决办法
9920
查看次数

使用EF6连接到SQL Server

高达EF5,为了连接到SQL Server 2012,我需要的是指定一个类似于下面的连接字符串:

Data Source=.\SqlExpress;Initial Catalog=MyDatabase;Integrated security=True;MultipleActiveResultSets=True
Run Code Online (Sandbox Code Playgroud)

这种方法不适用于EF6,给出例外

找不到'System.Data.Odbc'ADO.NET提供程序的实体框架提供程序.确保提供程序已在应用程序配置文件的"entityFramework"部分中注册

我根本没有使用app.config文件,我将连接字符串传递给MyContext构造函数.为什么它试图使用Odbc提供程序,而不是使用System.Data.SqlClient?

使用EF6代码优先连接到SQL Server需要做些什么?我确保EntityFramework.dll和EntityFramework.SqlServer.dll都在Application文件夹中可用.我甚至在WPF项目中添加了EF6 nuget包v6.0.0.1,虽然它不直接使用EF库,并确保将自动创建的App.Config文件(由nuget)复制到Application(Debug)文件夹 - 仍然没有成功.

我也试过在代码中手动setprovider:

public class OeeCoachConfiguration : DbConfiguration
{
    public OeeCoachConfiguration()
    {
        SetProviderServices("System.Data.SqlClient",
            System.Data.Entity.SqlServer.SqlProviderServices.Instance);
    }
}
Run Code Online (Sandbox Code Playgroud)

仍然没有成功.我的项目结构如下(简化):

WPF项目 - 没有引用EF(也试过添加EF引用)

ViewModel类库 - 没有引用EF

模型类库 - 引用EF库(两个dll)

数据类库 - 引用UI库(两个dll).

我正在使用CodeFirst方法,这个设置对EF5没有任何问题.任何帮助是极大的赞赏.

entity-framework entity-framework-6

9
推荐指数
2
解决办法
6318
查看次数

FTP上载文件使用HTTP代理时不支持请求的FTP命令

有人可以看看下面的代码并告诉我我做错了什么.我只是在圈子里,任何指针都非常感激

public class FtpWebRequestUtil
{
    private static string RemoteHost;
    private static string RemoteFtpPath;
    public static NetworkCredential Credential = new NetworkCredential();

    public FtpWebRequestUtil()
    {
    }

    public FtpWebRequestUtil(string RemoteAddress, string RemotePath, string RemoteUser, string RemotePwd)
    {
        Credential.UserName = RemoteUser;
        Credential.Password = RemotePwd;
        RemoteHost = RemoteAddress;
        RemoteFtpPath = RemotePath;
    } 

    public string UploadFile(string localFilePath)
    {
        int startTime = Environment.TickCount;
       // Console.WriteLine("Uploading File " + localFilePath);
        try
        {
            FileInfo localFile = new FileInfo(localFilePath); //e.g.: c:\\Test.txt
            byte[] buf = new byte[2048];
            int iWork;
            string remoteFile …
Run Code Online (Sandbox Code Playgroud)

c# ftp ftpwebrequest

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

具有可编辑集合的MVVM示例,其中View不直接使用模型类型

我看过很多人说模型类型不应该暴露给View,而是应该包含在ViewModel类型中.是否有一些示例我可以看到如何使用Entity Framework在ViewModel和Model数据之间完成同步.特别是,我需要一个可编辑集合的示例(例如:显示Customer列表的DataGrid或DataForm).

所以,这样的事情

http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

但使用可编辑的集合数据,而不仅仅是只读.

我感兴趣的一个例子:

1)网格需要显示产品.显示3列:

  • 产品代码
  • 产品名称
  • 产品类别
  • 产品单位

类型是枚举,我们说:ProductType {TypeA,TypeB}.如果你发现难以实现枚举,那么让它成为一个int,它不是一个问题.重要的是,如果在somce其他表中已将Product用作引用,则无法更改Type.我正在使用此规则,因为您无法使用属性(数据注释)执行此操作,并且需要在ViewModel端完成此操作.

必须将产品类上的每个属性绑定到CustomerViewModel属性.您可以为代码和名称添加一些规则:

代码唯一名称:必需,MaxLength(30)

编辑:我主要关注的是我们如何在批量更新中实现ViewModel和EF Model之间的同步.一个例子是:

1)当删除Product时,如果我们从ProductViewModel集合和DBContext中删除它,当用户决定取消(出错或什么)时会发生什么?我们是否需要从数据库重新加载所有产品并重新创建所有ProductViewModels?

2)用户更改产品并将产品置于无效状态(请记住,除非我们决定将其刷新到数据库,否则对象仍然可以接受无效状态).然后用户将光标移动到另一个产品,更改它(此产品保持有效状态),然后执行save命令.那时我们应该怎么做?

我有解决所有这些问题的方法,但我不确定它们是否正确,是否有更好的方法,所以我之所以要求在日常工作中使用这种方法的人提出其他意见.

wpf mvvm

8
推荐指数
1
解决办法
1262
查看次数

如何使用SSMS中的表值参数执行存储过程

当我右键单击存储过程,并选择执行存储过程命令时,我应该将表值参数作为值传递给什么?

我不是在谈论SSMS"查询"窗口.我正在谈论右键单击SP时显示的"执行过程"对话框.

我可以通过此屏幕直接将参数值提供给SP吗?

ssms sql-server-2012

8
推荐指数
1
解决办法
4192
查看次数

哪里可以下载.NET 4.5 redistributable(官方MS链接)

奇怪的是我在MS site 4.5可再发行(离线)版本上找不到任何地方.4.5.1和4.5.2 都有链接,但4.5不是.

谁知道为什么会这样呢?

.net-4.5

8
推荐指数
1
解决办法
6603
查看次数