1

我有一堆 BLL 对象,它们是模型优先场景中数据库中直接映射的实体。我通过像这样的接口(从 BLL 层)通过 BLL 从 DAL 获取这些对象到表示层:

    public static ILanguage GetNewLanguage()
    {
        return new Language();
    }


    public static bool SaveLanguage(ILanguage language)
    {
        return DAL.Repositories.LanguageRepository.Save(language);
    }

在表示层中,我只需通过以下调用即可获得对象:

ILanguage 语言 = BLL.Repository.GetNewLanguage();

现在我有一堆对象,我想让 BLL 方法通用,所以我不必为每个对象编写相同的代码。

但我不知道该怎么做。任何帮助都是appriciated,谢谢。

/芬恩。

4

2 回答 2

0

好吧,已经有一段时间了,对不起!

我成功地创建了一个通用方法。而不是每个实体都这样:

public static ILanguage GetNewLanguage()
    {
        return new Language();
    }

我现在正在使用这种通用方法(但我认为它仍然是一种笨拙的方法):

public static T CreateNew<T>(out string errmsg) where T : class
    {
        errmsg = string.Empty;

        // Loading the DAL assembly as you cannot allways be sure that it is loaded,
        // as it can be used from the GAC and thereby not accessible as a loaded assembly.
        AppDomain.CurrentDomain.Load("DAL");

        // From loaded assemblies get the DAL and get the specific class that implements 
        // the interface provided, <T>.
        // It is assumed for the time being, that only one BLL dataobject implements the interface.
        var type = AppDomain.CurrentDomain.GetAssemblies()
            .SelectMany(s => s.GetTypes())
            .Where(p => typeof(T).IsAssignableFrom(p) && p.IsClass)
            .FirstOrDefault();

        try
        {
            // Create an instance of the class that implements the interface in question, unwrap it 
            // and send it back as the interface type.
            var s = Activator.CreateInstance("DAL", type.FullName);
            return (T)s.Unwrap();
        }
        catch (Exception ex)
        {
            errmsg = ex.ToString();
            return null;
        }

    }

表示层的调用现在看起来像这样:

string errmsg = string.Empty;
ILanguage language = BLL.CreateNew<ILanguage>(out errmsg);

我解决了明显的问题,但仍然没有以一种奇特的方式。我有一个使用 DI 将程序集彼此分离的想法,但我不确定如何执行此操作。评论非常受欢迎。如果我找到一个解决方案,我会在新线程中发布解决方案。

而且,当我弄清楚这一点后,我将在一个新线程中发布一个解决方案,以解决 Crud 关于如何将 BLL 与 DAL 与存储库类分离的想法!

干杯芬恩。

于 2013-11-17T11:28:08.923 回答
0

为每个实体类型创建存储库类可能会导致大量冗余代码。只需通过以下示例代码使用通用存储库模式即可。

这里

于 2013-11-10T08:34:41.913 回答